Une fonction regex bien utile : preg_match_all

Publié dans PHP | Marqué avec ,
Share

J’avais utilisé cette fonction il y quelques temps et je n’arrivais à mettre la main dessus. preg_match_all() est très pratique lorsque l’on souhaite récupèrer plusieurs données d’un seul coup. Que fait-elle en gros ? On lui fournit un pattern (comme pour une regex classique, c’est le patron de ce que l’on cherche), une chaine de caractères dans laquelle effectuer la recherche, un array dans lequel on mettra les données et des options si besoin.

  • Dans la case 0 de l’array de retour, on aura un array avec toutes les chaines de caractères correspondant au pattern. (ce qui correspond au $0)
  • Dans la case 1 de l’array de retour, on aura un array avec tous les $1 de chaque chaines de caractères correspondant au pattern.
  • Dans la case 2, de l’array de retour, on aura un array avec tous les $2, … et ainsi de suite.

Exemple

Dans ma variable $content, j’ai le contenu suivant :

Nom : Duck, Prénom : Donald;
Nom : Mouse, Prénom : Mickey;
Nom : Duck, Prénom : Daisy;

Pour récupèrer les noms et prénoms de chacun des personnages, je peux donc utiliser la regex suivante :

preg_match_all('!Nom : ([^,]+), Prénom : ([^,]+);\n!isU', $content, $out, PREG_PATTERN_ORDER);

Affichons l’array de retour à l’arrache pour voir le résultat :

echo '<pre>'; print_r($out); echo '<pre><br />';

On voit bien que l’on un array avec des sous array content $0, $1, etc. On peut donc afficher noms et prénoms (ou les enregistrer dans une base de données si l’on préfère) de la manière suivante :

$nb = count($out[0]); for($i=0; $i<$nb; $i++) { 
	echo 'Patron : '.$out[0][$i].'<br />'; 
	echo $out[1][$i].' '; 
	echo $out[2][$i].'<br />';
}

Tout ceci nous évite d’utiliser plein de preg_replace() couplés avec un petit explode(). Quand c’est possible, c’est tout de même bien plus simple avec preg_match_all(). Bon, comme ça, je suis sûr de ne plus oublier cette petite fonction bien pratique.

2 Responses to Une fonction regex bien utile : preg_match_all

Répondre à BN Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *