2009-09-16 9 views
1

J'ai des données similaires à cela:question preg_match_all (comment limiter la portée sans appel séparé preg_match)

aaa1|aaa2|ZZZ|aaa3|aaa4|aaa5|ZZZ|aaa6|aaa7

Je veux correspondre tous « aaa [0-9] » ENTRE « ZZZ » (non ceux à l'extérieur).


J'ai un code PHP:

 

    $string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7"; 

    preg_match_all("/zzzz.*(aaa[0-9]).*zzzz/", $string, $matches, PREG_SET_ORDER); 

    print_r($matches); 

Mais il émet seulement:

 
Array 
(
    [0] => Array 
     (
      [0] => zzzzaaa3aaa4aaa5zzzz 
      [1] => aaa5 
     ) 

) 

Je veux "Aaa3", "aaa4" en plus de "aaa5".

Y at-il un moyen de le faire avec 1 appel à preg_match_all()?

Répondre

1

Vérifiez que la chaîne se produit avant un délimiteur (zzzz) mais pas avant deux chaînes de delimiter:

$string = "aaa1aaa2zzzzaaa3aaa4aaa5zzzzaaa6aaa7"; 

preg_match_all("/aaa[0-9](?=.*?zzzz)(?!(?>.*?zzzz).*?zzzz)/", $string, $matches, PREG_SET_ORDER); 

print_r($matches); 
0

Je ne pense pas que ce soit possible avec un seul appel. Vous devrez faire un appel pour extraire le contenu entre vos délimiteurs (zzzz) puis un autre appel pour retirer toutes les paires correspondantes.

if (preg_match('/zzzz(.*?)zzzz/', $string, $matches)) { 
    preg_match_all('/(aaa\d)/', $matches[1], $newmatches); 
    print_r($newmatches); 
} else { 
    echo "No match"; 
} 
+0

Merci - malheureusement 1 appel est la seule option que j'ai. C'est un système de tierce partie que je connais appelle preg_match_all mais je ne peux pas changer le code, seulement nourrir une règle. –