2009-09-29 17 views
12

En perl regex podemos extraer las variables coincidentes, a continuación.Extraer coincidencias de php regex

# extract hours, minutes, seconds 
    $time =~ /(\d\d):(\d\d):(\d\d)/; # match hh:mm:ss format 
    $hours = $1; 
    $minutes = $2; 
    $seconds = $3; 

¿Cómo hacer esto en php?

$subject = "E:[email protected] I:100955"; 
$pattern = "/^E:/"; 
if (preg_match($pattern, $subject)) { 
    echo "Yes, A Match"; 
} 

¿Cómo extraer el correo electrónico de allí? (Podemos explotarlo y obtenerlo ... pero nos gustaría un método para obtenerlo directamente a través de regex)?

Respuesta

17

Trate de usar la sintaxis sub-patrón con nombre de preg_match:

<?php 

$str = 'foobar: 2008'; 

// Works in PHP 5.2.2 and later. 
preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches); 

// Before PHP 5.2.2, use this: 
// preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches); 

print_r($matches); 

?> 

Salida:

Array (
    [0] => foobar: 2008 
    [name] => foobar 
    [1] => foobar 
    [digit] => 2008 
    [2] => 2008) 
1

utilizar el parámetro matchs de la función preg_match de la siguiente manera:

partidos
Si se proporciona coincidencias, entonces se llena con los resultados de búsqueda. $ coincidencias [0] contendrá el texto que coincide con el patrón completo, $ coincidencias [1] tendrá el texto que coincide con el primer subpatrón entre paréntesis capturado, y así sucesivamente.

8

Compruebe el php manual

int preg_match ($ cadena patrón, cadena $ asunto [, array & $ coincidencias [, int $ flags [, int $ desplazamiento]]])

Si coincidencias se proporciona, luego se completa con los resultados de la búsqueda. $ coincidencias [0] contendrá el texto que coincidió con el patrón completo, $ coincidencias 1 tendrá el texto que coincide con el primer subpatrón entre paréntesis capturado , y así sucesivamente.

$subject = "E:[email protected] I:100955"; 
$pattern = "/^E:(?<contact>\w+) I:(?<id>\d+)$/"; 
if (preg_match($pattern, $subject,$matches)) { 
    print_r($matches); 
} 
3

puede simplemente modificar su expresión regular actual para capturar todo tras los dos puntos hasta el primer espacio:

$subject = "E:[email protected] I:100955"; 
$pattern = "/^E:([^ ]+)/"; 
if (preg_match($pattern, $subject, $m)) { 
    echo "Yes, A Match"; 
} 
$email = $m[1]; 

En caso de que no esté familiarizado con regexp, [^ ]+ significa "cualquier carácter excepto un espacio" y no requiere espacio para estar presente para trabajar. Si por alguna razón la entrada cambia a "E: [email protected]" sin el bit "I: 12345", seguirá funcionando.

Cuestiones relacionadas