Quelques autres façons à ajouter au livre d'astuces RegEx :
Tout d'abord, vous pouvez compacter votre RegEx en: /(<br\s*/?>)+/i
et le remplacer par <br />
(pas besoin de surcharger le RegExP avec des lookaheads) et vous vous retrouverez toujours avec le saut de ligne XHMTL que vous avez choisi.
Autres moyens de modifier votre RegEx afin qu'il ne déclenche pas le */
commentaire de ?>
fin ou le script de fin:
- Utilisez des quantificateurs possessifs :
#(<br\s*+/?+>)+#i
- ce qui signifie essentiellement \s*+
si vous avez trouvé que les espaces correspondent autant qu'il y en a et conservez-les, et /?+
si vous avez trouvé une barre oblique, gardez-la!
- Enclose
\s*
et /*
en groupes de capture =>#(<br(\s*)(/?)>)+#i
Démos en direct: http://codepad.viper-7.com/YjqUbi
Et puisque nous avons penché le comportement possessif, le RegEx le plus rapide qui contourne également le problème des commentaires est: démo expliquée#(<br\s*+/?+>)++#i
Quant aux commentaires dans des situations délicates
Lorsque vous ne pouvez pas modifier le code, ou avez déjà utilisé un commentaire multiligne et:
1. Utilisez un nowdoc :
$string='Hello<br>World<br><br />World<br><br><br>Word!';
<<<'comment'
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;
Code en direct: http://codepad.viper-7.com/22uOtV
Remarque: un nowdoc est similaire à un heredoc mais il n'analyse pas le contenu et doit avoir son séparateur de début entre '
guillemets simples '
( notez que le délimiteur de fin ne peut pas être identifié , doit être suivi d' ;
une nouvelle ligne ! )
2. Sautez le code avec un goto :
$string='Hello<br>World<br><br />World<br><br><br>Word!';
goto landing;
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
landing:
Exemple en direct: http://codepad.viper-7.com/UfqrIQ
3. Sautez le code avec if(false)
ou if(0)
:
$string='Hello<br>World<br><br />World<br><br><br>Word!';
if(0){
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
}
Test: http://codepad.viper-7.com/wDg5H5