Foros del Web » Programando para Internet » PHP »

Expresión regular: falla cuando hay más de 1 match

Estas en el tema de Expresión regular: falla cuando hay más de 1 match en el foro de PHP en Foros del Web. Buenas, Necesito un script que me de un array del parámetro pasado a la función prueba() de una página en concreto. Me explico, si en ...
  #1 (permalink)  
Antiguo 16/09/2012, 09:24
 
Fecha de Ingreso: agosto-2007
Mensajes: 48
Antigüedad: 16 años, 8 meses
Puntos: 2
Exclamación Expresión regular: falla cuando hay más de 1 match

Buenas,

Necesito un script que me de un array del parámetro pasado a la función prueba() de una página en concreto. Me explico, si en la página prueba.php hay <span><?php prueba("hola"); ?></span><p><?php prueba("adios"); ?></p> necesito que me capture en un array "hola" y "adios".

He creado un script que recorre el archivo y mediante la función preg_match() captura lo que quiero:

Código PHP:
function get_prueba()
{
    
$file "test.php";

    
//más codigo de abrir el fichero

    
$patron '/prueba\((\"|\')(.+)(\"|\')\)\;/';
    while(!
feof($file))
    {
        if(
preg_match($patronfgets($file), $coincidencias))
        {
            
$keys[$i] = $coincidencias[2];
            
$i++;
        }    
    }
    
fclose($file);
    
print_r($keys);

Y el archivo $file contiene el siguiente código:

Código PHP:
<table>
    <tr>
        <td><?php prueba('hola'); ?></td>
        <td><?php prueba("que tal"); ?></td>        
        <td><?php prueba("adios"); ?></td>
    </tr>
</table>
Hasta aquí el resultado es correcto:

Cita:
Array ( [0] => hola [1] => que tal [2] => adios )
El problema viene cuando encuentra más de una función en la misma linea, algo como esto:

Código PHP:
<table>
    <tr>
        <td><?php prueba('hola'); ?></td><td><?php prueba("que tal"); ?></td>    
        <td><?php prueba("adios"); ?></td>
    </tr>
</table>
El array que me devuelve entonces es:

Cita:
Array ( [0] => hola'); ?> adios )
Como tengo que modificar el patrón para que me salga bien con más match en una misma linea?

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 16/09/2012, 14:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresión regular: falla cuando hay más de 1 match

Debes quitarle "hambre" al cuantificador que captura todo, otra sería indicarle que capture todo excepto paréntesis.

Cita:
.+?
[^()]+
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 16/09/2012, 15:39
 
Fecha de Ingreso: agosto-2007
Mensajes: 48
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Expresión regular: falla cuando hay más de 1 match

Cita:
Iniciado por pateketrueke Ver Mensaje
Debes quitarle "hambre" al cuantificador que captura todo, otra sería indicarle que capture todo excepto paréntesis.
Muchas gracias, ha mejorado algo la cosa, ahora me lo captura bien pero solo la primera función de la linea, se come el "que tal". He probado:

Código PHP:
$patron '/txt\((\"|\')([^()]+)(\"|\')\)\;/';

//y también

$patron '/txt\((\"|\')(.+?)(\"|\')\)\;/'
Con las dos obtengo:

Cita:
Array ( [0] => hola [1] => adios )
Tendría que añadir un salto de línea después de cada llamada a la función prueba() que detecte? O se puede afinar más la expresión regular? Por más que sigo buscando y probando no encuentro nada bueno.

Muchas gracias de nuevo pateketrueke.
  #4 (permalink)  
Antiguo 16/09/2012, 15:55
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresión regular: falla cuando hay más de 1 match

Es extraño, mira: http://ignite.io/code/50564934ef167b6f77000000

Y viendo así es mejor preg_match_all(), aśi te ahorras el bucle.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 16/09/2012, 16:21
 
Fecha de Ingreso: agosto-2007
Mensajes: 48
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Expresión regular: falla cuando hay más de 1 match

Ahora sí que sí, con preg_match_all(). Muchísimas gracias pateketrueke, de verdad :D.

Etiquetas: falla, match, regular
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 22:28.