Foros del Web » Programando para Internet » PHP »

Problema con preg_match_all

Estas en el tema de Problema con preg_match_all en el foro de PHP en Foros del Web. Hola, otra vez mas por aca, despues de un buen rato de no poder recurro a ustedes, expertos, a ver si me pueden ayudar un ...
  #1 (permalink)  
Antiguo 24/01/2012, 21:26
 
Fecha de Ingreso: septiembre-2010
Mensajes: 48
Antigüedad: 10 años, 9 meses
Puntos: 3
Problema con preg_match_all

Hola, otra vez mas por aca, despues de un buen rato de no poder recurro a ustedes, expertos, a ver si me pueden ayudar un poco:

Código PHP:
Ver original
  1. <?php
  2. $string = '<a href="/search?q=test+test+test+test&amp;st=0&amp;TEST=TEST">Test</a>
  3. <a href="/search?q=test+test+test+test&amp;st=1&amp;TEST=TEST">Test</a>
  4. <a href="/search?q=test+test+test+test&amp;st=2&amp;TEST=TEST">Test</a>
  5. <a href="/search?q=test+test+test+test&amp;st=3&amp;TEST=TEST">Test</a>
  6. <a href="/search?q=test+test+test+test&amp;st=4&amp;TEST=TEST">Test</a>
  7. <a href="/search?q=test+test+test+test&amp;st=5&amp;TEST=TEST">Test</a>';
  8. $exp = preg_match_all("/st=(.*)/", $string, $salida, PREG_PATTERN_ORDER);
  9. print_r($salida);
  10. ?>

Y me regresa:

Cita:
Array
(
[0] => Array
(
[0] => st=0&amp;TEST=TEST">Test</a>
[1] => st=1&amp;TEST=TEST">Test</a>
[2] => st=2&amp;TEST=TEST">Test</a>
[3] => st=3&amp;TEST=TEST">Test</a>
[4] => st=4&amp;TEST=TEST">Test</a>
[5] => st=5&amp;TEST=TEST">Test</a>
)

[1] => Array
(
[0] => 0&amp;TEST=TEST">Test</a>
[1] => 1&amp;TEST=TEST">Test</a>
[2] => 2&amp;TEST=TEST">Test</a>
[3] => 3&amp;TEST=TEST">Test</a>
[4] => 4&amp;TEST=TEST">Test</a>
[5] => 5&amp;TEST=TEST">Test</a>
)

)
Quisiera saber que estoy haciendo mal ya que solo necesito que me regrese el valor de st, por ejemplo, 0, 1, 2, 3, 4 y 5(en este caso), gracias de antemano.
  #2 (permalink)  
Antiguo 24/01/2012, 21:34
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 9 años, 10 meses
Puntos: 793
Respuesta: Problema con preg_match_all

No le estás dando límite a la búsqueda y te falta tal vez agregar un ? y ser más específico:

cambia:

/st=(.*)/

por

/st=(.*?)&/

[APORTE] Expresiones PCRE
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 24/01/2012, 21:38
 
Fecha de Ingreso: septiembre-2010
Mensajes: 48
Antigüedad: 10 años, 9 meses
Puntos: 3
Respuesta: Problema con preg_match_all

Muchas gracias, la verdad intente eso pero agregando un espacioy no lo logre; otra cosa, el (.*?) para que te sirve ? combinado con el .*, digamos, el numero que quiero sacar puede llegar a tener 1000, ¿influye?.

P.D. Leere el post, gracias de nuevo.
  #4 (permalink)  
Antiguo 24/01/2012, 22:01
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 9 años, 10 meses
Puntos: 793
Respuesta: Problema con preg_match_all

el ? se usa cuando hay saltos de línea para que capture correctamente del principio al final de cada aparición. No importa si el numero es 1 millón porque le estas diciendo que cualquier cosa que esté entre st= y &

También te puede servir

/st=([0-9]+)&/

y poner el límite que quieras.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 25/01/2012, 05:17
 
Fecha de Ingreso: septiembre-2010
Mensajes: 48
Antigüedad: 10 años, 9 meses
Puntos: 3
Respuesta: Problema con preg_match_all

Sí, estuve leyendo un poco al respecto y tambien tenia pensado utilizar 0-9 o :digit:, y aprovechando el tema de los saltos de linea y expresiones regulares (ya que no quiero crear otro topic porque seria spam):

Cuando tengo codigos como:

Cita:
<li>
<div class="ekiz">




texto</div>
Y ocupo sacar lo que esta entre <div class="ekiz"> y </div>, ¿como podria?, ya que sinceramente en la mayoria de los scripts que hago generalmente recurro a utilizar explode() porque los espacios en blanco (ni usando trim()) o saltos de linea me permiten manipular bien un string por mi falta de experiencia en el tema; por ejemplo, en el source anterior si intento hacer algo como:

Código PHP:
Ver original
  1. <?php
  2. $source = '<li>
  3. <div class="ekiz">
  4.  
  5.  
  6.  
  7.  
  8. texto</div>';
  9. $preg = preg_match("/<div class=\"ekiz\">(.*)<\/div>/", $source, $salida);
  10. echo $salida[1];
  11. ?>

No me regresaria resultado alguno.

Gracias de antemano.
  #6 (permalink)  
Antiguo 25/01/2012, 10:03
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 9 años, 10 meses
Puntos: 793
Respuesta: Problema con preg_match_all

Te falta agregar una s al final de la expresión

Cita:
i Insensitivo – no distingue mayúsculas de minúsculas
m Multilinea - ^ y $ indican el inicio y fin de cada linea
s Todo - el . (punto) captura todo, incluyendo nueva linea
x Extendido – comentarios & espacios
e Evaluar (preg_replace) – interpreta el reemplazo como código PHP
S Análisis extra del patron
U El patron es insatisfactorio
u El patron es tratado como UTF-8
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: expresiones, preg_math_all, 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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:46.