2011-05-12 8 views
8

Quiero capturar un patrón hasta, pero sin incluir la primera instancia de un otro patrón opcional con preg_match, por ejemplo:expresión regular para capturar todo antes de la primera cadena opcional

ABCDEFGwTW$%       | capture ABCD 
@Q%[email protected]%hg afdgwsa g weg#D DEFG | capture @Q%[email protected]%hg afdgwsa g weg#D D 
@Q%[email protected]%hg afdgwsa g weg#D DEFG | capture @Q%HD 

Así que en el caso anterior nada antes de la primera Se captura la instancia de la cadena EFG. Además, si la cadena EFG no está presente, entonces quiero capturar toda la cadena.

yo habría pensado que el siguiente iba a funcionar, pero no hubo suerte:

$pattern = '/(.*)(?:EFG)?/'; 
preg_match($pattern, '[email protected]#%GEFGw35hqb', $matches); 
print_r($matches); 
//should give: '[email protected]#%G' 

Respuesta

16

Puede utilizar

'/(.*?)(?=EFG|$)/' 
+0

ah muy bien - no pensé en hacer coincidir el EFG o el final de la línea :) – mulllhausen

+0

'/ (. *?) (?: des | $) /' también funciona :) – mulllhausen

2

Prueba esto: (.*?)(?:EFG|$)

Esto coincidirá con cualquier carácter (las menos posibles) hasta que encuentra EFG.

+0

el problema es que no coincidirá con una cadena que no contenga EFG – mulllhausen

+0

Correcto, ¡vaya! Coincide con el personaje de fin de línea, también. (Respuesta actualizada) –

+0

lo siento @Josh M., @Jens lo golpeó: P – mulllhausen

0

Usted puede tener el resultado con mucha menos confusión:

sólo echa una versión más simple del patrón que corresponda, y si no, utilice la cadena original:

<?php 
$match = '[email protected]#%GEFGw35hqb'; 
if (preg_match('/^(.*)EFG/', $match, $matches)) { 
    $match = $matches[1]; 
} 

echo $match; 
+0

Sí, podría haber hecho algo similar con 'stripos' también, pero pensé que aprendería un poco sobre regex - es más preciso – mulllhausen

+0

Sí;) aunque, si el rendimiento es un problema, debe usar' strpos';) – Yoshi

1

Otra manera de hacerlo:

$str = '[email protected]#%GEFGw35hqb'; 
$res = preg_split('/EFG/', $str); 
print_r($res); 
+0

o mejor aún 'list ($ match) = preg_split ('/ EFG /', $ haystack) 'para capturar la cadena directamente en un vairable :) – mulllhausen

Cuestiones relacionadas