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.

Était-ce utile?

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);

http://ideone.com/uHJCC

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top