Foros del Web » Programando para Internet » PHP »

problema de expresiones regulares?

Estas en el tema de problema de expresiones regulares? en el foro de PHP en Foros del Web. Tengo un texto dividido en tres secciones así: Cita: <section> Modelling, Texturing and Animating a Hand </section> <section> <h3> <strong>by Julian MacDonald</strong> </h3> </section> <section> ...
  #1 (permalink)  
Antiguo 15/05/2010, 14:24
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
problema de expresiones regulares?

Tengo un texto dividido en tres secciones así:

Cita:
<section>
Modelling, Texturing and Animating a Hand
</section>

<section>
<h3>
<strong>by Julian MacDonald</strong>
</h3>
</section>

<section>
<h2>
<strong class="c3">Adding a Texture</strong>
</h2><br />
<br />
<br />
There are a number of options available for applying a texture to the hand object. For a simplistic, cartoonish look we could go for a uniform texture and that would be technically quite
simple.<br />
<br />
<a class="c1" href="hand_skeleton.html"><span class="arrows fLeft">Previous: Setting up the Skeleton</span></a> <a class="c1" href="hand_animation.html"><span class="arrows fRight">Next: Animating
the Hand</span></a> <a class="c1" href="contents.html"><span class="arrows">Back to Contents</span></a><br />
</section>
Lo estoy queriendo cortar en partes:
Código PHP:
// $patron = '/<section>(.*?)<\/section>/is';
$patron '/<section>((?:(?!section>).)*)<\/section>/isU';

preg_match_all($patron$texto$matchesPREG_SET_ORDER);
                
echo 
count($matches); 
Para muchas paginas que proceso con este script, todo va bien. Pero para la pagina que pongo por ejemplo, solo me reconoce dos partes, siendo que tiene 3 o mas. No veo que pueda ser diferente en este html de los demas html. Pero tengo 3 o 4 pagina que se cortan en la segunda seccion, y la expresion regular no reconoce mas allá de eso. Me doy cuenta por el count() y también porque no me las imprime.

Que puede estar pasando? Todo parece simple y logico!
  #2 (permalink)  
Antiguo 15/05/2010, 14:38
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

Probe cortar así y funciona:

Cita:

$corte = explode("<section>",$texto);
$matches= str_replace("</section>","",$corte);
Me devuelve 3 o 4 partes (en vez de 2)

Esto me trae mucha inseguridad porque ya procesé muchas paginas con el metodo de expreiones regulares, y recién ahora me doy cuenta de que falla.:(

Pero por qué falla?
  #3 (permalink)  
Antiguo 15/05/2010, 18:00
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

Acabo de descubrir algo. El problema pasa luego de recibir el html vía post.

El flujo de mi programa es así:

- una pagina envía el html a otra
- la segunda pagina secciona el html

Si seccione desde la primera pagina funciona ok. El problema es al seccionar luego de recibir el contenido html vía POST, que envío con jquery.

Alguna ayuda?
  #4 (permalink)  
Antiguo 15/05/2010, 18:23
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 14 años, 5 meses
Puntos: 89
Respuesta: problema de expresiones regulares?

Hazle un var_dump al contenido recibido por jQuery, y luego ves el código fuente. Quizá tienes alguna función que escape caracteres html al enviar por jQuery, y eso impide que PHP reconoza el "<section>"/"</section>".
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #5 (permalink)  
Antiguo 15/05/2010, 18:35
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

Hice esto:
var_dump(print_r($matches));
Y me devolvió lo de siempre (que lo veo por un alert en jquery) + bool(true)

Tambien hice un var_dump antes de enviar la informacion y recibi string(2354).

Pero seguro que no hay nada de mas, porque en jquery valido la respuesta asi:
Cita:
if(data=="1"){
section.remove();
}
Y funciona.

Última edición por mayid; 15/05/2010 a las 19:53
  #6 (permalink)  
Antiguo 15/05/2010, 20:00
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 10 años, 2 meses
Puntos: 10
Respuesta: problema de expresiones regulares?

Yo lo hice asi y me devuelve "3":



<?

$texto="<section>
Modelling, Texturing and Animating a Hand
</section>

<section>
<h3>
<strong>by Julian MacDonald</strong>
</h3>
</section>

<section>
<h2>
<strong class='c3'>Adding a Texture</strong>
</h2><br />
<br />
<br />
There are a number of options available for applying a texture to the hand object. For a simplistic, cartoonish look we could go for a uniform texture and that would be technically quite
simple.<br />
<br />
<a class='c1' href='hand_skeleton.html'><span class='arrows fLeft'>Previous: Setting up the Skeleton</span></a> <a class='c1' href='hand_animation.html'><span class='arrows fRight'>Next: Animating
the Hand</span></a> <a class='c1' href='contents.html'><span class='arrows'>Back to Contents</span></a><br />
</section>";

// $patron = '/<section>(.*?)<\/section>/is';
$patron = '/<section>((?:(?!section>).)*)<\/section>/isU';

preg_match_all($patron, $texto, $matches, PREG_SET_ORDER);

echo count($matches);

?>



/* fijate en la pequeña diferencia con el tuyo */
/* fijate de ponerlo con comillas simples a ver que pasa */
/* ya que asi de modo plano, literal , funciono */

Última edición por wiwi74; 15/05/2010 a las 20:07
  #7 (permalink)  
Antiguo 15/05/2010, 20:06
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

Yo acabo de probarlo con ese html y me devuelve 3 tambien. Pero ese html esta puesto con copy+paste, y ademas está simplificado.

La diferencia que nombras es esta? PREG_SET_ORDER? Probe con diferentes flags, pero nada.

Y vuelvo a decir, antes de enviar el contenido con ajax desde jquery, la expresion funciona. Pero tras usar:

.html() y luego $.ajax() no va.

Gracias por probar.

Ps: NO SE COMO PROBAR ESTO SIN JQUERY! ES QUE NO SE COMO ENVIAR EL HTML VIA POST. Pruebo algo así pero no me funciona bien:
echo '<input name="a_page" type="hidden" value="'.addslashes($texto).'" />'."\r";

me imprime en pantalla antes de enviar. Y me aparecen cosas sueltas como:

" />

Última edición por mayid; 15/05/2010 a las 20:14
  #8 (permalink)  
Antiguo 15/05/2010, 20:39
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 10 años, 2 meses
Puntos: 10
Respuesta: problema de expresiones regulares?

Es cierto que esta copiaro y pegado, pero se puede recupear siendo que este en un archivo externo:

Por ahora ve esto a ver si te sive de algo:

Crea un archivo php y solo presiona el boton, luego.



<?

$texto="<section>
Modelling, Texturing and Animating a Hand
</section>

<section>
<h3>
<strong>by Julian MacDonald</strong>
</h3>
</section>

<section>
<h2>
<strong class='c3'>Adding a Texture</strong>
</h2><br />
<br />
<br />
There are a number of options available for applying a texture to the hand object. For a simplistic, cartoonish look we could go for a uniform texture and that would be technically quite
simple.<br />
<br />
<a class='c1' href='hand_skeleton.html'><span class='arrows fLeft'>Previous: Setting up the Skeleton</span></a> <a class='c1' href='hand_animation.html'><span class='arrows fRight'>Next: Animating
the Hand</span></a> <a class='c1' href='contents.html'><span class='arrows'>Back to Contents</span></a><br />
</section>";


?>
<form action="" method="post">
<input type="hidden" name="texto" value="<?=$texto?>">
<input type="submit" value="Eniar">
</form>
<?

//echo $_POST['texto'];

// $patron = '/<section>(.*?)<\/section>/is';
$patron = '/<section>((?:(?!section>).)*)<\/section>/isU';

preg_match_all($patron, $_POST['texto'], $matches, PREG_SET_ORDER);

echo count($matches);

?>
















<!--
Por aqui vi un post:
http://dgmmorales.com/blog/?p=32
-->
  #9 (permalink)  
Antiguo 15/05/2010, 20:45
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

A veces (con algunas paginas) todo va bien. Pero con otras no. Entonces estoy viendo que puede llegar a ser un problema de comillas. Mi html tiene comillas simple y dobles. Escapandolas no consigo nada, pero estoy probando cosas como htmlspecialchars()

Estoy a ciegas pero confio en que sea un tema de comilla y que lo pueda solucionar con alguna funcion.


Probe tu ejemplo. Me devuelve 0

Ademas tuve que agregar <?php a las etiquetas, y un isset:

Cita:
if(isset($_POST['texto'])){
$patron = '/<section>((?:(?!section>).)*)<\/section>/isU';

preg_match_all($patron, $_POST['texto'], $matches, PREG_SET_ORDER);

echo count($matches);
}
  #10 (permalink)  
Antiguo 15/05/2010, 20:56
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

APARENTEMENTE EL TEMA ESTA SOLUCIONADO!

echo '<input name="a_page" type="hidden" value="'.htmlspecialchars($texto).'" />'."\r";
  #11 (permalink)  
Antiguo 15/05/2010, 21:32
Avatar de wiwi74  
Fecha de Ingreso: marzo-2008
Mensajes: 515
Antigüedad: 10 años, 2 meses
Puntos: 10
Respuesta: problema de expresiones regulares?

La verda que no se...

Al presionar el boton el cero se convertia en 3, lo deje sin filtro porque no hacia falta...

Y si tuviste que agregar <? => <?php es por tu configuracion en php.ini

...Que pensandolo bien debe de ser la causa de tus inconvenientes con las comillas...
  #12 (permalink)  
Antiguo 15/05/2010, 23:14
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 9 años, 1 mes
Puntos: 101
Respuesta: problema de expresiones regulares?

Si, el tema era de comillas. Pero recién mañana lo voy a terminar de probar. Creo que va a ir bien.

Etiquetas: expresiones, regulares
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.