Je veux obtenir $ {1} = Titre, $ {2} = Ouvrir, $ {3} = Bla-bla-bla.Comment faire une expression régulière correcte
de
{{Title|Open
Bla-bla-bla
}}
Je veux obtenir $ {1} = Titre, $ {2} = Ouvrir, $ {3} = Bla-bla-bla.Comment faire une expression régulière correcte
de
{{Title|Open
Bla-bla-bla
}}
Qu'en est-il quelque chose comme ceci:
$str = <<<STR
{{Title|Open
Bla-bla-bla
}}
STR;
$matches = array();
if (preg_match("/^\{\{([^\|]+)\|([^\n]+)(.*)\}\}$/s", $str, $matches)) {
var_dump($matches);
}
Il vous obtenez:
array
0 => string '{{Title|Open
Bla-bla-bla
}}' (length=28)
1 => string 'Title' (length=5)
2 => string 'Open' (length=4)
3 => string '
Bla-bla-bla
' (length=14)
Ce qui signifie que, après avoir utilisé trim
sur $matches[1]
, $matches[2]
et $matches[3]
, vous obtenez ce que vous avez demandé :-)
Explication de la regex:
^
{
caractères, qui doivent être échappé, car ils ont une signification particulière[^\|]+
()
il est capturé - retourné comme la première partie du résultat|
doit être échappé aussi.|
qui doit être échappé.[^\n]+
()
il est capturé trop - deuxième partie du résultat.*
pratiquement « tout » anynumber fois
()
il est capturé trop - troisième partie du résultat}
(échappèrent aussi)$
Et notez l'expression rationnelle a s
(dotall) modificateur; voir Pattern Modifiers, à ce sujet.
$string = "{{Title|Open
Bla-bla-bla
}}";
preg_match('/^\{\{([^|]+)\|(.*?)[\r\n]+(.*?)\s*\}\}/', $string, $matches);
print_r($matches);
http://www.gskinner.com/RegExr/
un endroit utile pour jouer et apprendre les expressions rationnelles.
En Perl:
/\{\{ # literal opening braces
(.*?) # some characters except new line (lazy, i. e. as less as possible)
\| # literal pipe
(.*?) # same as 2 lines above
\n # new line
([\s\S]*?) # any character, including new line (lazy)
\}\}/x; # literal closing braces
Faire une solution plus précise dépend de ce que les règles exacte que vous voulez pour l'extraction de vos champs.
+1 pour expliquer l'expression rationnelle en détail! –