Foros del Web » Programando para Internet » PHP »

ayuda aprendiendo expresiones regulares

Estas en el tema de ayuda aprendiendo expresiones regulares en el foro de PHP en Foros del Web. Buenas estoy intentando aprender todo lo que pueda a manejar las expresiones regulares siguiendo varios hilos de estos foros y uno muy bueno que me ...
  #1 (permalink)  
Antiguo 03/12/2009, 14:48
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
ayuda aprendiendo expresiones regulares

Buenas estoy intentando aprender todo lo que pueda a manejar las expresiones regulares siguiendo varios hilos de estos foros y uno muy bueno que me he topado googleando http://www.google.es/url?sa=t&source...mJj5RC-s0su9hg
Tengo un problemilla con una expresión regular ; lo que quiero es conseguir urls y que el resto no me lo guarde en el array, para ello intento hacerlo de este modo pero me falla:
eregi('http://(.+)\.php',$lineas[$i],$regs);

Bueno por si acaso indico que $lineas es un array con trozos de código donde además de las ursl están etiquetas como title que quiero evitar.

¿Como puedo hacer para si tengo un trozo de código por ejemplo:
href="http://www.loquesea.com " title="loquesea"
me guarde solo http://www.loquesea.com .

Agradezco cualquier ayuda porque he investigado googleando y en php.net y no consigo dar con la tecla correcta.
Mil gracias desde ya.
__________________
Videotutoriales de Drupal
  #2 (permalink)  
Antiguo 03/12/2009, 14:53
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: ayuda aprendiendo expresiones regulares

Mira esto a ver si es lo que deseas http://www.forosdelweb.com/3031878-post6.html
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 03/12/2009, 14:55
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: ayuda aprendiendo expresiones regulares

primero.. ereg y todas esas cosas estan pasadas de moda.. no las uses
ahora empieza con preg :P
Código php:
Ver original
  1. $string = 'href="http://www.loquesea.com " title="loquesea"';
  2. $string = preg_match_all('/href=(?:"|\')(.+)(?:"|\'){1}/iU',$string,$retorno);
  3. print_r($retorno[1]);

ahi hay una sacada del horno de hidek1 xD!..

saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 03/12/2009, 16:31
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Código php:
Ver original
  1. $string = 'href="http://www.loquesea.com " title="loquesea"';
  2. $string = preg_match_all('/href=(?:"|\')(.+)(?:"|\'){1}/iU',$string,$retorno);
  3. print_r($retorno[1]);
saludos![/QUOTE]

Gracias, pero sinceramente no entiendo muy bien esta expresión.

preg_match_all('/href=(?:"|\')(.+)(?:"|\'){1}/iU',$string,$retorno);

Se lo que hace preg_match_all pero me armo un lío al intentar comprender eso que puse en negritas , la verdad que he leído muchos hilos de este foro y más cosillas php.net etc etc.. pero sigo sin entender muchas cosas acerca de este tipo de expresiónes.

SEguiré investigando.

Un saludo y gracias
__________________
Videotutoriales de Drupal
  #5 (permalink)  
Antiguo 03/12/2009, 16:36
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ayuda aprendiendo expresiones regulares

es algo simple...
Cita:
/ separador inicial
href= frase literal
(?:"|\') un tipo de comilla (opcional)
(.+) lo que sea (captura)
(?:"|\'){1} un tipo de comilla, solo una (opcional)
/ separador final
iU modificadores, insensible a mayus/minus y "Ungreedy pattern"
te sugiero leer el siguiente tema:
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 04/12/2009, 09:50
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por pateketrueke Ver Mensaje
es algo simple...


te sugiero leer el siguiente tema:
http://www.forosdelweb.com/f18/aport...s-pcre-646110/
Ok gracias seguiré leyendo cosillas, pero lo que no entiendo por ahora es este cacho del código:
(?:"|\') un tipo de comilla (opcional) , en realidad el resto lo he entendido pero el significado del
interrogante con los dos puntitos no lo entiendo.
Según el enlace que me enviste dice esto :
(?:) No captura subpatron - ((?:foo|fu)bar) captura foobar o fubar sin que foo o fu se capture como subpatron

Pero sinceramente no entiendo nada. ¿que es foobar y fubar?

Otra cosa , si yo quiero poner por ejemplo que la url tengo un string entero como patrón, ¿como tengo que hacer?,
es decir por ejemplo si quiero que las urls sean solo las que tienen la palabra casa ?.

Un saludo
__________________
Videotutoriales de Drupal

Última edición por Dundee; 04/12/2009 a las 09:56
  #7 (permalink)  
Antiguo 04/12/2009, 09:53
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: ayuda aprendiendo expresiones regulares

(?:"|\')

?: -> para que el match no se ejecute por estar entre parentesis..
" -> comilla doble
| -> o
\' -> comilla simple
__________________
More about me...
~ @rhyudek1
~ Github
  #8 (permalink)  
Antiguo 04/12/2009, 10:01
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por Hidek1 Ver Mensaje
(?:"|\')

?: -> para que el match no se ejecute por estar entre parentesis..
Perdón por la insistencia pero singo sin entender el código ?: ¿que es el match?.

Gracias por la ayuda.
__________________
Videotutoriales de Drupal
  #9 (permalink)  
Antiguo 04/12/2009, 10:10
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: ayuda aprendiendo expresiones regulares

match son las coincidencias que php busca dentro del string con la expresion regular..
estos se buscan con parentesis
ej:

Código php:
Ver original
  1. $string = "quiero buscar lo que :este: entre dos puntos";
  2. $string = preg_match('/:(.*):/',$string,$devuelve);
  3. echo $devuelve[1];

si te fijas ahi ase "match" lo que esta entre dos puntos por que esta entre parentesis
entonces para preguntar entre una cosa u otra se utiliza asi
(esto|o esto)
entonces yo no quiero que php tome eso comor resultado
entonces le antepongo ?: en el parentesis

(?:esto no saldra :P|pq io lo ordeno :O)

saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #10 (permalink)  
Antiguo 04/12/2009, 10:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por Dundee Ver Mensaje
[...] Pero sinceramente no entiendo nada. ¿que es foobar y fubar? [...]
Esto es importante de comentar, y es algo que además es usado comúnmente en tutoriales, referencias y documentación: foo, bar, baz, buzz, etc...

Se les conoce como variables meta-sintácticas, osea... que pueden ser lo que tu quieras

Solo se emplean para fines de ejemplos, pueden ser: pepito, juanita, casa, o la cadena que mas te acomode para fines de ejemplificación...

Cita:
(?:) No captura subpatron - ((?:foo|fu)bar) captura foobar o fubar sin que foo o fu se capture como subpatron
Si evitas el prejuicio de decir: esas no son mis variables, no las entiendo... ¬¬

pues fácilmente entenderías...
Cita:
((?:p|m)a){1,2}
Este ultimo ejemplo capturaría las palabras: pa, ma, papa, mama (usando el mismo patrón [que es lo importante, no las variables])

Y esto aplica para muchos casos, donde recalco, se suele comentar: "pero ese no es mi código y ¡no lo entiendo!! ¿podrías darme otro que tenga que ver con mi ejemplo??"

...y cosas del estilo, un poco de reflexión te debió dar la respuesta mucho antes de leer esto....


PDTA

(foo|bar) agrupa y captura
(?:foo|bar) agrupa, pero NO captura

...si, como Hidek1 comenta: match es "capturar"
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 04/12/2009, 10:28
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Ok , mil gracias por la ayuda , la verdad que cuando tocas por primera vez las expresiones regulares suena todo a chino, aunque ya voy entendiendo un poco más el tema gracias a vuestros ejemplos y aclaraciones; de todas formas no se porque esto me da error:

$texto="El perro de ramón ramirez no tiene rabo porque pedra se lo ha cortado papa y mama";
preg_match_all('((?:p|m)a){0,}',$texto,$captura);

Mi intención era mostrar los strings que contengan la letra p o m 0 o más veces, pero me sale este error.

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '{' in C:\xampp\htdocs\practicas\expresionesregulares\pre g_match_all.php on line 4

Gracias y un saludo a tod@s
__________________
Videotutoriales de Drupal
  #12 (permalink)  
Antiguo 04/12/2009, 10:31
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: ayuda aprendiendo expresiones regulares

preg_match_all('/((?:p|m)a){0,}/',$texto,$captura);

recuerda que PRCE necesita delimitadores!
__________________
More about me...
~ @rhyudek1
~ Github
  #13 (permalink)  
Antiguo 04/12/2009, 10:48
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por Hidek1 Ver Mensaje
preg_match_all('/((?:p|m)a){0,}/',$texto,$captura);

recuerda que PRCE necesita delimitadores!
Ok, entonces si he entendido bien eso es correcto?

preg_match_all('/href=(?:"|\')(.+)(?:"|\'){1}/iU',$url,$retorno);

exactamente lo que quiero es sacar todos los enlaces de mi página y capturar lo que hay entre comillas simples o dobles y solo eso , es decir nada de title ni demas atributos de los enlaces.
De todas formas lo he probado y me devuelve un array vacío por lo que intuyo que algo no he escrito correctamente

Sigo intentando hacer ejercicios sobre esto con un ejemplo que capture todos los href de una url en cocreto, pero me devuelve esto vacío:
array(3) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } }
Supongo que algo seguiré escribiendo mal pero no doy con el tema. Agradecería también si alguien sabe de alguna url con ejercicios resuletos para practicar este tema (ejercicios de expresiones regulares) que quiero aprender de una vez a usarlo correctamente.

$res=preg_match_all('/^href=(\'.+\')|(\".+\")/',$url,$retorno);

He probado también así y nada:
$res=preg_match_all('/href=\'.+\'|\".+\"/',$url,$retorno);

Mil gracias por la ayuda
__________________
Videotutoriales de Drupal

Última edición por Dundee; 04/12/2009 a las 12:21
  #14 (permalink)  
Antiguo 04/12/2009, 12:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ayuda aprendiendo expresiones regulares

mmm....

a mi me parece que estas fallando en otra cosa... la variable $url ¿que contiene??

porque si es una URL .. obvio no te va a funcionar !!

ya que preg_match_all() no carga la URL como cadena... primero, tu debes cargar el contenido de la URL en una string... y ya luego usar la expresión

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #15 (permalink)  
Antiguo 04/12/2009, 13:10
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por pateketrueke Ver Mensaje
mmm....

a mi me parece que estas fallando en otra cosa... la variable $url ¿que contiene??

porque si es una URL .. obvio no te va a funcionar !!

ya que preg_match_all() no carga la URL como cadena... primero, tu debes cargar el contenido de la URL en una string... y ya luego usar la expresión

Jeje si es cierto me había dado cuenta despúes de un par de horas comiéndome la oya. De todas formas sigo sin hacer lo que pretendo.

Como verás ahora si cojo el contenido de la variable $url que era lo que me fallaba.
El tema es que si hago esto:
$res=preg_match_all('/http:\/\/www.unawebcualquiera.com\/contacto\/(.+)\//',file_get_contents($url),$retorno);
Me coje demasiados datos y yo quiero que coja de url en url, por ello he intentado hacerlo de este modo pero me devuelve el var_dump un array vacío.
array(2) { [0]=> array(0) { } [1]=> array(0) { } } NULL

$res=preg_match_all('/^http:\/\/www.unawebcualquiera.com\/contacto\/(.+)\/$/',file_get_contents($url),$retorno);

Un saludo
__________________
Videotutoriales de Drupal
  #16 (permalink)  
Antiguo 04/12/2009, 13:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ayuda aprendiendo expresiones regulares

al delimitar con ^ y $ quiere decir que la cadena a comparar debes ser precisa, que empiece y termine tal cual dicta la expresión... lo cual, en tu caso es erróneo

si buscas solo enlaces, buscar por href me pareció mas correcto
Cita:
/href="([^"]+)"/isU
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #17 (permalink)  
Antiguo 05/12/2009, 05:07
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
De acuerdo Respuesta: ayuda aprendiendo expresiones regulares

Cita:
Iniciado por pateketrueke Ver Mensaje
al delimitar con ^ y $ quiere decir que la cadena a comparar debes ser precisa, que empiece y termine tal cual dicta la expresión... lo cual, en tu caso es erróneo

si buscas solo enlaces, buscar por href me pareció mas correcto
Gracias Pateketrueke lo he mejorado un poquillo
$res=preg_match_all('/href="([^" | ^\']+)"/isU',file_get_contents($url),$retorno);

Pero aún así necesito que me devuelva los enlaces que quiero no todos, es decir los enlaces que por ejemplo lleven la palabra "casa" , tipo:
http`://www.loquesea/unacosamas/casa/
Por muchas vueltas que doy no se como narices hacerlo.

He probado también así:
$res=preg_match_all('/href="([^" | ^\']+)\/casa\/"/isU',file_get_contents($url),$retorno);
Pero nada de nada , me devuelve un array vacío totalmente.


Tampoco entiendo el significado de la U ¿codicia? ¿que es eso?.
# U - Modificador que invierte la codicia de las expresiones regulares.
Fuente:
http://www.php-hispano.net/archivos/...egulares1.html

Haciendo esto consigo todas las urls de una página:
$res=preg_match_all('/href="([^" | ^\']+)\/casa\/(.+)"/isU',file_get_contents($url),$retorno);

Pero ahora me gustaría poder filtrar los resultados de una vez lo máximo posible para optimizar el tema y que no recoja todas sino las que lleven como antes decía la palabra "casa", por que lo que no comprendo es porque además de devolverme dichos enlaces (los que tienen la palabra casa), me devuelve otros muchos strings, es como si los cortara y me los devolviera enteros los enlaces y cortados, por ejemplo:
href="http://www.miweb.com/casa/5-plantas/" y también me devuelve 5-plantas/, si yo ahora qusiera que no me devolviera esto último 5-plantas/ ¿como tendría que esribir la expresión regular?. Por otro lado también me devuelve el href , pero supongo que esto tedré que eliminarlo con funciones de strings de PHP ¿o se puede decir que no me lo devuelve también en la expresión regular?

Esto de las expresiones regulares está claro que necesita mucha práctica , por eso quiero hacer ejercicios hasta hartarme.

Un saludo y gracias .
__________________
Videotutoriales de Drupal

Última edición por Dundee; 05/12/2009 a las 05:45 Razón: ampliar el post
  #18 (permalink)  
Antiguo 06/12/2009, 04:52
Avatar de Dundee  
Fecha de Ingreso: junio-2002
Ubicación: El Médano
Mensajes: 1.310
Antigüedad: 22 años, 5 meses
Puntos: 8
Respuesta: ayuda aprendiendo expresiones regulares

El tema de porque me devolvía tantos datos el array lo he podido comprender gracias a este link que pego aquí por si a alguien más puede servir: (está muy bien explicado).
http://www.elwebmaster.com/editorial...es-regulares-2
__________________
Videotutoriales de Drupal
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 21:53.