Une des lignes de mon script contient une balise de fermeture PHP à l'intérieur d'une chaîne. En fonctionnement normal, cela ne pose pas de problème, mais je dois commenter la ligne.
J'ai essayé de commenter cette ligne avec //
, /*
*/
et #
mais aucune d'entre elles ne fonctionne, l'analyseur considère la balise de fermeture comme une balise de fermeture réelle.
Voici la ligne en question:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
Que puis-je faire pour commenter la ligne ci-dessus?
<?php # echo 'simple';?>
.Réponses:
Utilisez une astuce: concaténez la chaîne de deux morceaux. De cette façon, la balise de fermeture est coupée en deux et n'est plus une balise de fermeture valide.
'?>' --> '?'.'>'
Dans votre code:
Cela fera
//
fonctionner les commentaires.Pour que les
/* */
commentaires fonctionnent, vous devez également diviser la*/
séquence:Souvenez-vous, parfois, même si le tout est plus que la somme de ses parties - mais être gourmand est mauvais, il y a des moments où il vaut mieux en avoir moins . :)
la source
??<
Le moyen le plus simple
Créez une variable distincte pour contenir votre expression régulière; de cette façon, vous pouvez simplement commenter la
preg_replace()
déclaration:Correction en utilisant des classes de caractères
Pour corriger les commentaires de ligne, vous pouvez rompre
?>
en insérant>
une classe de caractères comme ceci:Pour corriger les commentaires de bloc, vous pouvez l'appliquer à
/
:Pour corriger les deux styles de commentaire, vous pouvez mettre
/
et>
dans leur propre classe de caractères.Correction à l'aide du
/x
modificateurLe
x
modificateur - akaPCRE_EXTENDED
- ignore les espaces et les retours à la ligne dans une expression régulière (sauf lorsqu'ils se produisent à l'intérieur d'une classe de caractères); cela permet d'ajouter des espaces pour séparer les caractères problématiques. Pour corriger les deux styles de commentaire:la source
x
modificateur :)g
Pourquoi vos tentatives n'ont pas fonctionné:
Ce qui fonctionne:
Plus loin...
Après ce qui précède, vous devriez pouvoir utiliser
/*
pour commenter la ligne. Si vous laissez?>
intact,//
vous ne pouvez pas commenter une ligne entière. Le texte suivant?>
pourrait être html, qui est hors du contrôle de l'interpréteur PHP, donc cela ne fonctionnerait pas.De la documentation:
la source
Une autre idée: échappez au
>
(et au/
, si vous souhaitez utiliser un/*...*/
commentaire):Un échappement «inutile» est ignoré par le moteur de regex, mais est utile dans ce cas (pour les raisons exposées dans les autres réponses).
la source
Pourquoi utiliser des «astuces» compliquées et difficiles à lire pour contourner le problème?
?
est juste un raccourci quantificateur pour plus de commodité, doncUtilisez simplement la version longue du quantificateur
{0,1}
, qui signifie "minimum 0 maximum 1 occurrence":la source
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:#(<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!\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 :
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 :
Exemple en direct: http://codepad.viper-7.com/UfqrIQ
3. Sautez le code avec
if(false)
ouif(0)
:Test: http://codepad.viper-7.com/wDg5H5
la source