149 votes

Convertir la balise de fermeture dans le commentaire PHP

L'une des lignes dans mon script contient une balise de fermeture PHP à l'intérieur d'une chaîne. En fonctionnement normal, cela ne cause pas un problème, mais j'ai besoin de mettre en commentaire la ligne.

J'ai essayé de commenter cette ligne avec //, /* */ et # mais aucune de ces travaux, l'analyseur estime balise de fermeture d'une balise de fermeture.

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?

124voto

ppeterka Points 12141

Utiliser une astuce: concaténer la chaîne à partir de deux morceaux. De cette façon, la balise de fermeture est coupé en deux, et n'est pas une balise de fermeture plus. '?>' --> '?'.'>'

Dans votre code:

$string = preg_replace('#<br\s*/?'.'>(?:\s*<br\s*/?'.'>)+#i', '<br />', $string);

Cela rendra // commentaires le travail.

Pour /* */ commentaires pour travailler, vous devez diviser l' */ séquence de trop:

$string = preg_replace('#<br\s*'.'/?'.'>(?:\s*<br\s*'.'/?'.'>)+#i', '<br />', $string);

Rappelez-vous, parfois, même si le tout est plus que la somme de ses parties, mais étant gourmand est mauvais, il ya des moments que vous êtes mieux à gauche avec moins. :)

73voto

Jack Points 88446

La manière la plus simple

Créer une variable pour contenir votre expression régulière; de cette façon, vous pouvez simplement commenter l' preg_replace() déclaration:

$re = '#<br\s*/?>(?:\s*<br\s*/?>)+#i';
// $string = preg_replace($re, '<br />', $string);

Fixer à l'aide des classes de caractères

Pour fixer la ligne de commentaires, vous pouvez briser ?> en mettant > à l'intérieur d'une classe de caractères comme suit:

$string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i', '<br />', $string);
                                 ^ ^              ^ ^

Pour fixer le bloc de commentaires, vous pouvez l'appliquer à d' /:

$string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i', '<br />', $string);
                               ^ ^              ^ ^

Pour fixer les deux commentaires de styles, vous pouvez mettre / et > dans leur propre classe de personnage.

Fixer à l'aide de l' /x modificateur

L' x modificateur - aka PCRE_EXTENDED - ignore les espaces et retours à la ligne dans une expression régulière (sauf quand ils se produisent à l'intérieur d'une classe de caractères); il est ainsi possible d'ajouter des espaces pour séparer les problématiques de caractères. Pour fixer les deux commentaires du style:

$string = preg_replace('#<br\s* /? >(?:\s*<br\s* /? >)+#ix', '<br />', $string);
                               ^  ^             ^  ^

38voto

Anirudh Ramanathan Points 25113

Pourquoi vos tentatives ne fonctionne pas:

// $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',...
                                   ^ doesn't work due to ?> ending php

/* $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',... */
                                 ^ doesn't work due to */ closing comment

Ce qui fonctionne:

/* $string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i',... */
                                  ^ ^              ^ ^
// $string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i',...
                                    ^ ^              ^ ^

Plus loin...

Après le ci-dessus, vous devriez être en mesure d'utiliser /* de commentaire de la ligne. Si vous laissez l' ?> intact, // ne peut pas commenter une ligne entière. Le texte suivant ?> pourrait être html, ce qui est en dehors du contrôle de l'interprète PHP, donc ça ne fonctionne pas.

À partir de la documentation:

Le "on-line" commentaire styles seul commentaire à la fin de la ligne ou l'actuel bloc de code PHP, selon la première éventualité. Cela signifie que Code HTML après l' // ... ?> ou # ... ?> SERA imprimé: ?> éclate de PHP mode et retourne au mode HTML, et // ou # ne peuvent pas influencer qu'.

15voto

Tim Pietzcker Points 146308

Une autre idée : échapper à la (et les , si vous souhaitez utiliser un `` commentaire) :

Une évasion « inutile » est ignorée par le moteur d’expression régulière, mais elle est utile dans ce cas (pour les raisons exposées dans les autres réponses).

10voto

stema Points 36113

Pourquoi utiliser compliquée, difficile à lire « astuces » pour contourner le problème ?

``est juste un raccourci de quantificateur pour plus de commodité, ainsi

Il suffit d’utiliser la version longue du quantificateur `` , signifie « minimum 0 maximale 1 occurrence » :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X