regex pour analyser le texte en italique?
Question
Supposons que j'ai le texte suivant:
__This_is__ a __test__
En utilisant deux underscores pour désigner italique. Donc, je pense This_is
et test
à italiques. Les diktats de la logique que tout texte entre deux doubles consécutifs underscores doivent être écrits en italique, y compris tout autre nombre de underscores qui peuvent être là. J'ai:
__([^_]+)__
Quel est l'équivalent de « pas deux traits de soulignement consécutifs » dans le groupe 1? Merci.
La solution
Une option serait de faire correspondre deux underscores:
__
Ensuite, faire un regard négatif avant de voir s'il y a pas deux underscores avant de la position actuelle:
__(?!__)
si ce n'est pas le cas, correspond à tout caractère:
__(?!__).
et répéter la précédente ou plusieurs fois:
__((?!__).)+
et enfin correspondre à deux autres underscores:
__((?!__).)+__
qui est la solution finale.
Une petite démo:
<?php
$text = '__This_is__ a __test__';
preg_match_all('/__(?:(?!__).)+__/', $text, $matches);
print_r($matches);
?>
produit:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
)
comme on le voit sur Ideone .
EDIT
Notez que j'ai utilisé un groupe non-capture dans ma démonstration, sinon la sortie aurait ressemblé à ceci:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
[1] => Array
(
[0] => s
[1] => t
)
)
i.e.. le dernier caractère identifié par ((?!__).)
aurait été capturée dans le groupe 1.
En savoir plus sur les groupes, voir: http://www.regular-expressions.info/brackets. html
Autres conseils
$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);