2 votes

Comment puis-je faire correspondre cette notation semblable à un tableau en utilisant regex en PHP?

Je tente de faire correspondre le motif semblable à un tableau suivant avec regex :

foo[bar][baz][bim]

Je suis presque là avec le regex suivant :

~([^[]+)(?:\[(.+?)\])*~gm

Cependant, les groupes de capture incluent seulement :

Correspondance complète : foo[bar][baz][bim]
Groupe 1 : foo
Groupe 2 : bim

Je n'arrive pas à comprendre pourquoi il capture seulement la dernière occurrence de la structure []. J'aimerais qu'il capture foo, bar, baz et bim dans ce cas.

Des idées sur ce que j'oublie ?

2voto

revo Points 5311

Les groupes de capture répétés dans PCRE ne se souviennent pas des valeurs de chaque motif précédent. Pour cela, vous devez invoquer le jeton \G:

(?|(\w+)|\G(?!\A)\[([^][]*)\])

Voir démonstration en direct ici

Décomposition de l'expression régulière :

  • (?| Début d'un groupe de réinitialisation de branche
    • (\w+) Capturer des caractères de mot
    • | Ou
    • \G(?!\A) Continuer à partir de la fin du dernier motif
    • \[ Faire correspondre un crochet ouvrant
    • ([^][]*) Capturer n'importe quoi sauf [ et ]
    • \] Faire correspondre un crochet fermant
  • ) Fin du groupe

Code PHP :

preg_match_all('~(?|(\w+)|\G(?!\A)\[([^][]*)\])~', 'foo[bar][baz][bim]', $matches);
print_r($matches[1]);

1voto

Andreas Points 13389

Cela peut également être analysé sans regex.
Supprimez la balise de fermeture ] puis éclatez sur la balise d'ouverture [.

$str = "foo[bar][baz][bim]";

$str = str_replace("]","",$str);
$arr = explode("[", $str);
var_dump($arr);

Renvoie :

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "baz"
  [3]=>
  string(3) "bim"
}

Où le premier élément est le nom du "array" et les suivants sont les enfants/chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X