2015-12-31 3 views
1

A ont ceci:preg_match_all - comment attraper tous les sous-modèles

$pattern = "/\b(?:(one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)*){4,8}/ix"; 
$subject = "one four-six nine twelve 
zero eight nine nine seven three six six"; 
$matches = []; 

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER); 

Ce que je veux voir est tous les mots séparés dans $matches mais j'obtenir seulement neuf pour le premier et six pour la seconde - les derniers mots de grand modèle. Je sais que je peux mettre tous les mots simples entre parenthèses, mais est-il plus bon moyen + je vais obtenir des chaînes vides de cette façon

sortie comme:

array (size=2) 
    0 => 
    array (size=2) 
     0 => string 'one four-six nine twelve 
zero eight nine ' (length=46) 
     1 => string 'one' 
     2 => string 'four' 
     3 => string 'six' 
     4 => string 'nine' 
     5 => string 'twelve' 
     6 => string 'zero' 
     7 => string 'eight' 
     8 => string 'nine' 
    1 => 
    array (size=2) 
     0 => string 'nine seven three six six' (length=24) 
     ... 
+0

Veuillez préciser votre résultat attendu. –

+0

Cherchez-vous [quelque chose comme ça] (http://ideone.com/O5pZb0)? –

+0

Non. J'ai ajouté la sortie comme j'attendais – frenzy

Répondre

0

Changé le code pour tous vos numéros et a ajouté un groupe nommé appelé numéro:

<?php 
$pattern = '/\b(?<number>one|two|three|four|five|(?:s|z)ix|seven|eight|nine|zero|twelve)(?:\s|-)/'; 
$subject = "one four-six nine twelve 
zero eight nine nine seven three six six"; 
$matches = []; 

preg_match_all ($pattern, $subject, $matches, PREG_SET_ORDER); 
print_r($matches); 
?> 

Cela a douze (tous) les résultats. Voir une démo sur regex101.com here.

+1

Nah, ils ont été groupés de 4 à 8 pour une raison. – frenzy

0

Ce que je veux voir est tous les mots séparés dans $matches mais j'obtenir seulement neuf pour le premier et six pour la seconde - les derniers mots de grand modèle.

Malheureusement, c'est la façon dont il est, comme indiqué pour Repetition:

Lorsqu'un sous-masque est répété, la valeur capturée est la sous-chaîne qui correspondait à la dernière itération.


Je sais que je peux mettre tous les mots simples entre parenthèses, mais est-il plus bonne façon ...

Une approche consiste à diviser les correspondances trouvées après:

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER); 
foreach ($matches as &$m) 
    // replace $m[1] with the split match 
    array_splice($m, 1, 1, preg_split('/\s|-/', $m[0], 0, PREG_SPLIT_NO_EMPTY)); 
unset($m); // remove the reference to the last element 

Ceci donnera le résultat souhaité en $matches.