Foros del Web » Programación para mayores de 30 ;) » RegExp »

[SOLUCIONADO] problema con parentesis

Estas en el tema de problema con parentesis en el foro de RegExp en Foros del Web. Buenas, estoy intentando hacer un preg_match_all() , pero he de utilizar un parentesis para orientar a la funcion en la busqueda Código PHP: preg_match_all ( ...
  #1 (permalink)  
Antiguo 07/08/2013, 12:07
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
problema con parentesis

Buenas, estoy intentando hacer un preg_match_all() , pero he de utilizar un parentesis para orientar a la funcion en la busqueda


Código PHP:
preg_match_all("(\">(.*)</a> (<span class=\")siU"$web2$titulos_busq); 
la cosa es que no se como hacer para que lo coja como string y no me abra nuevo parentesis, haciendo que se me quede un parentesis sin cerrar, porque hay de más que estan abiertos.. he probado en ponerle una barra invertida ( \ ) como para anularlo, pero no funciona

gracias

Última edición por Doch; 07/08/2013 a las 12:42
  #2 (permalink)  
Antiguo 07/08/2013, 12:53
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: problema con parentesis

nose porque se ha movido el tema a RegExp, creo que no tiene nada que ver lo que estoy preguntando...
  #3 (permalink)  
Antiguo 07/08/2013, 14:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con parentesis

¿Cómo que por qué?

Porque tu tema tiene que ver con la expresión regular en si, que estés usando PHP no convierte tu problema en uno de PHP.

Ahora, analicemos lo que nos dices:
Cita:
pero he de utilizar un parentesis para orientar a la funcion en la busqueda
¿A qué te refieres con eso?

Te recuerdo que los paréntesis en RegExp sirven para capturar y/o agrupar sub-grupos de expresiones, si deseas que los paréntesis sean tomados como literales y no como carácteres especiales entonces sí debes ecaparlos.

Explica a presición lo que buscas con la expresión regular, el código PHP es irrelevante pero también convendría saber qué es lo que buscas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 07/08/2013, 18:25
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: problema con parentesis

con palabras faciles, el parentesis "(" que esta a la izquierda del span en el codigo que puse, quiero que sea tomado como un texto y no como un parentesis que abre alguna cosa dentro de la funcion o lo que sea, espero haberme explicado jaja

gracias por responder

Última edición por Doch; 07/08/2013 a las 18:32
  #5 (permalink)  
Antiguo 07/08/2013, 20:38
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con parentesis

Ese es precisamente tu problema, debes escapar el paréntesis.
Cita:
\(<span
Y sí, tiene que ver con RegExp (expresiones regulares), te sugiero leer lo siguiente: http://php.net/manual/es/book.pcre.php

Sobre todo la sintaxis que es lo que te falla, porque RegExp se trata de otro lenguaje, un sub lenguaje que se incluye en la mayoría de lenguajes modernos, incluyendo PHP.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 08/08/2013, 07:50
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: problema con parentesis

ya probe en añadirle la barra invertida, pero no funcionó por eso puse el post, he estado leyendo sobre regex, y estoy intentando hacer una expresion que busque
Cita:
\">(.*)</a> (<span class=\"
pero me esta costando bastante, porque no hay una explicacion decente de como hacer las expresiones, o al menos no la he encontrado
  #7 (permalink)  
Antiguo 08/08/2013, 09:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con parentesis

En lugar de dar dando golpeas a ciegas, ¿por qué no nos muestras el código HTML de prueba?

Vamos, llevo varios años usando RegExp y lo que te digo de escapar debe funcionar, si no funciona no es ningún misterio de la expresión en si, sino que puede deberse a que la fuente de texto sencillamente no está bien cubierta.

A lo que me refiero es que RegExp no es tán inteligente, sólo buscará lo que le indiques con la expresión.

Si la fuente de texto original tiene espacios de más, o no siempre es la misma tu debes estár consciente de eso y definir una expresión más flexible.

Pero bueno, sin ver la fuente real del texto es imposible adivinar que estará mal.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 08/08/2013, 10:33
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: problema con parentesis

Código HTML:
<a href="/trucos/iphone/blastron/21736" title="Trucos de Blastron para iPhone">Blastron</a> (<span class="color53">iPhone</span>)</div> 
Lo que hago, o almenos intento hacer, es que preg_match_all() recoja el titulo y la consola del juego. Y utilizo esos dos cachos de codigo azul para orientar a la funcion por ejemplo para coger solo el titulo y el problema es que me cogen cachos del resto de la web que no se parecen al patron de azul, y al poner el cursor encima del parentesis escapado (rojo) todavia me pone que abre, cerrando el parentesis mas proximo dejandome uno abierto sin cerrar ( programando en notepad++ (nose si tendra algo que ver))

Código:
preg_match_all("(\">(.*)</a> (<span class=\"color)", $web1, $titulos_busq);

pd: ya me he asegurado que el codigo en azul solo se repite en el codigo html que he puesto, es decir que la funcion no deberia de coger el resto de la web
  #9 (permalink)  
Antiguo 08/08/2013, 10:57
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: problema con parentesis

Vale, ahora medio entiendo.

Acabo de probar tu expresión y me funciona excelente con dicho HTML, lo único que cambiaría es .* por [\w\s]+ para ser más claro.

Eso se debe a que .* significa "cualquier cosa" y siendo una expresión abierta puede capturar más allá de lo que tenías pensando, por eso tal vez no te funciona bien.

Entonces [\w\s]+ significa "cualquier palabra y/o espacios", lo cual limita la búsqueda claramente, pues es explícita.

Puede que esa sea la única razón además de que sigues sin escapar el paréntesis.
Código PHP:
Ver original
  1. // MAL
  2. preg_match_all("(\">(.*)</a> (<span class=\"color)", $web1, $titulos_busq);
  3.  
  4. // BIEN
  5. preg_match_all("(\">([\w\s]+)</a> \(<span class=\"color)", $web1, $titulos_busq);

Te sugiero consultar la referencia que te alcance anteriormente, esto se debe a que de todas las veces que te he dicho que escapes el paréntesis parece que no lo has hecho.

Y hay importantes observaciones al respecto del tipo de delimitadores que estás usando, pues los paréntesis son carácteres especiales, etc.

No pienso abordar esto aquí así que de verdad espero que leas la referencia.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 08/08/2013, 11:26
 
Fecha de Ingreso: mayo-2012
Mensajes: 76
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: problema con parentesis

realmente si que escape el parentesis, asi era como me cogia toda la web, si no daria un fallo al ejecutar el archivo, lo que se me ha escapado al pasarlo a la web jaja

con el [\w\s]+ ahora va bastante bien, hay un pequeño fallo de que los resultados me salen con un parentesis al final ej: ">Blastron (

aunque lo puedo eliminar con un str_replace

muchas gracias por tu ayuda pateketrueke

Etiquetas: php
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 23:19.