Foros del Web » Programando para Internet » Javascript »

Expresión regular: <tag>Contenido</tag>, no me funciona :S

Estas en el tema de Expresión regular: <tag>Contenido</tag>, no me funciona :S en el foro de Javascript en Foros del Web. Bueno, la cosa es que estoy tratando de "agarrar" unos tags determinados de un sitio, pero no funciona... La expresión que uso es: Código: (<span ...
  #1 (permalink)  
Antiguo 27/08/2009, 12:09
 
Fecha de Ingreso: mayo-2008
Ubicación: En la guarida del mal, tratando de conquistar el mundo
Mensajes: 174
Antigüedad: 16 años, 5 meses
Puntos: 2
Pregunta Expresión regular: <tag>Contenido</tag>, no me funciona :S

Bueno, la cosa es que estoy tratando de "agarrar" unos tags determinados de un sitio, pero no funciona...

La expresión que uso es:

Código:
(<span class=\"entry-content\">)(.)*(<\/span>)
Pero el problema es que por ejemplo...

Código:
<span class="entry-content">Contenido contenido contenido contenido etc etc etc</span>
Lo agarra perfecto, pero si está:

Código:
<span class="entry-content">Contenido contenido contenido contenido etc etc etc</span>
<span class="entry-content">Contenido contenido contenido contenido etc etc etc</span>
<span class="entry-content">Contenido contenido contenido contenido etc etc etc</span>
<span class="entry-content">Contenido contenido contenido contenido etc etc etc</span>
Cuando uso "match" pone a los 5 juntos en el primer elemento del array, ya que usa el último "span"...

Como hago para que sepere por cada </span> que encuentra? :S

Última edición por ZequeZ; 27/08/2009 a las 13:45 Razón: Cambio
  #2 (permalink)  
Antiguo 27/08/2009, 15:00
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Expresión regular: <tag>Contenido</tag>, no me funciona :S

el problema es la expresion, tienes que usar repeticion non-greedy. greedy significa codicioso, lo que significa que la repeticion selecciona todos los valores posibles. con non-greedy es al reverso, selecciona la menor cantidad posible.
Código:
// cambia;
(.)*
// por;
(.*?)
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 28/08/2009, 13:50
 
Fecha de Ingreso: mayo-2008
Ubicación: En la guarida del mal, tratando de conquistar el mundo
Mensajes: 174
Antigüedad: 16 años, 5 meses
Puntos: 2
Sonrisa Respuesta: Expresión regular: <tag>Contenido</tag>, no me funciona :S

Cita:
Iniciado por zerokilled Ver Mensaje
el problema es la expresion, tienes que usar repeticion non-greedy. greedy significa codicioso, lo que significa que la repeticion selecciona todos los valores posibles. con non-greedy es al reverso, selecciona la menor cantidad posible.
Código:
// cambia;
(.)*
// por;
(.*?)
Muchisimas gracias, me funcionó!
Ahora, lo que no entiendo es exactamente por funcionó! xD

Es decir, "(.*)" Busca cualquier caracter las veces que sea, y "(.*?)" yo lo leo como que le decis que busque cualquier caracter las veces que sea, pero que lo busque 0 o 1 vez, es decir, que en definitiva busque cualquier caracter :S

Alguien me explica? Porque no entendí porque hace eso :S
  #4 (permalink)  
Antiguo 28/08/2009, 22:08
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 7 meses
Puntos: 1485
Respuesta: Expresión regular: <tag>Contenido</tag>, no me funciona :S

te comprendo! yo estuve unos años sin entender el concepto hasta que un dia me canse e investigue. mi interpretacion era parecida a la tuya, pensaba algo como opcionalmente repetir el patron. para poder entenderlo no puedes separar las partes. ponlo de esta forma, el signo ? es una modificacion al repetidor *, de la misma forma que un elemento contiene atributos para modificar ciertas caracteristicas o un comando puede tener argumentos para llevar a cabo tareas mas especificas.

¿como funciona? bien simple! la mejor manera de ilustrarlo es con ejemplo. supongo que tenemos una serie de numeros que puede ser variable, por ejemplo "0123456789876543210". con expresion regulares podemos atraparlo con /\d+/. pero ahora digamos que solo quieres buscar hasta el primer "4" en la cifra. probablemente pienses que la solucion es /\d+4/. te llevaras una sorpresa porque el resultado devuelto es "012345678987654" cuando realmente lo que te interesa es la parte en negrita. como ya se habia explicado antes, sucede que los repetidores (*, +) son codiciosos, ellos intentan capturar todas las alternativas posibles con la expresion dada. la repuesta a este asunto es utilizar el ? para indicarle que solo busque lo necesario. por tanto /\d+?4/ devuelve "01234".

por otro lado, recuerda que el repetidor repite la expresion anterior. en este caso es \d que significa cualquier digito. en este caso particular, la razon por la que la expresion sin el ? recoge todas las alternativas posibles es porque el "4" forma parte de la clase \d. para hacerlo mas ilustrado, las expresiones evaluan de la siguiente forma:

/\d+4/
0123456789876543210

/\d+?4/
0123456789876543210
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 30/08/2009, 18:22
 
Fecha de Ingreso: mayo-2008
Ubicación: En la guarida del mal, tratando de conquistar el mundo
Mensajes: 174
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Expresión regular: <tag>Contenido</tag>, no me funciona :S

Cita:
Iniciado por zerokilled Ver Mensaje
te comprendo! yo estuve unos años sin entender el concepto hasta que un dia me canse e investigue. mi interpretacion era parecida a la tuya, pensaba algo como opcionalmente repetir el patron. para poder entenderlo no puedes separar las partes. ponlo de esta forma, el signo ? es una modificacion al repetidor *, de la misma forma que un elemento contiene atributos para modificar ciertas caracteristicas o un comando puede tener argumentos para llevar a cabo tareas mas especificas.

¿como funciona? bien simple! la mejor manera de ilustrarlo es con ejemplo. supongo que tenemos una serie de numeros que puede ser variable, por ejemplo "0123456789876543210". con expresion regulares podemos atraparlo con /\d+/. pero ahora digamos que solo quieres buscar hasta el primer "4" en la cifra. probablemente pienses que la solucion es /\d+4/. te llevaras una sorpresa porque el resultado devuelto es "012345678987654" cuando realmente lo que te interesa es la parte en negrita. como ya se habia explicado antes, sucede que los repetidores (*, +) son codiciosos, ellos intentan capturar todas las alternativas posibles con la expresion dada. la repuesta a este asunto es utilizar el ? para indicarle que solo busque lo necesario. por tanto /\d+?4/ devuelve "01234".

por otro lado, recuerda que el repetidor repite la expresion anterior. en este caso es \d que significa cualquier digito. en este caso particular, la razon por la que la expresion sin el ? recoge todas las alternativas posibles es porque el "4" forma parte de la clase \d. para hacerlo mas ilustrado, las expresiones evaluan de la siguiente forma:

/\d+4/
0123456789876543210

/\d+?4/
0123456789876543210
Muchas gracias, ahora entendí, muy bien explicado :P
Perdon por no responder antes, pero no estube en mi casa xD.
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 07:20.