sintaxis lista etiquetas ejemplos comentarios php regex tags comments

lista - Convierta la etiqueta de cierre de PHP en comentario



sintaxis php (6)

Una de las líneas en mi script contiene una etiqueta de cierre de PHP dentro de una cadena. Bajo operación normal esto no causa ningún problema, pero necesito comentar la línea.

Intenté comentar esta línea con // , /* */ y # pero ninguno funciona, el analizador considera que la etiqueta de cierre es una etiqueta de cierre real.

Aquí está la línea en cuestión:

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

¿Qué puedo hacer para comentar la línea anterior?


¿Por qué utilizar "trucos" complicados y difíciles de leer para solucionar el problema?

? es solo un atajo cuantificador por conveniencia, entonces

Solo use la versión larga del cuantificador {0,1} , significa "mínimo 0 ocurrencia máxima 1":

$string = preg_replace(''#<br/s*/{0,1}>(?:/s*<br/s*/{0,1}>)+#i'', ''<br />'', $string);


Algunas otras formas que vale la pena agregar al truco de RegEx :

Primero podría compactar su RegEx a: /(<br/s*/?>)+/i <br /> /(<br/s*/?>)+/i /?> /(<br/s*/?>)+/i y reemplazarlo con <br /> (no es necesario cargar el RegExP con lookaheads) y siempre terminará con su XHMTL elegido salto de línea.

Otras formas de modificar su RegEx para que no se dispare */ final comentario o ?> Script final:

  • Usa cuantificadores posesivos : #(<br/s*+/?+>)+#i - que básicamente significa para /s*+ si encuentras coincidencia de espacios en blanco tantos como hay y mantenlo, y para /?+ Si encontró una barra oblicua!
  • Incluya /s* y /* en grupos de captura => #(<br(/s*)(/?)>)+#i <br (/ /s* *) (/?)> #(<br(/s*)(/?)>)+#i

Demos en vivo: http://codepad.viper-7.com/YjqUbi

Y dado que apoyamos el comportamiento posesivo, el RegEx más rápido que también evita el problema de comentarios es: #(<br/s*+/?+>)++#i /? +> #(<br/s*+/?+>)++#i expliqué el demo

En cuanto a comentar en situaciones difíciles

Cuando no puede cambiar el código, o ya ha utilizado un comentario de varias líneas y:

1. Utiliza un nowdoc :

$string=''Hello<br>World<br><br />World<br><br><br>Word!''; <<<''comment'' $string = preg_replace(''#(<br/s*/?>)+#i'', ''<br />'', $string); comment;

Código en vivo: http://codepad.viper-7.com/22uOtV

Nota: un nowdoc es similar a un heredoc pero no analiza el contenido y tiene que tener su delimitador de inicio encerrado en '' comillas simples '' ( tenga en cuenta que el delimitador final no puede ser ideado , debe ir seguido de ; y una nueva línea !

2. Salta sobre el código con un goto :

$string=''Hello<br>World<br><br />World<br><br><br>Word!''; goto landing; $string = preg_replace(''#(<br/s*/?>)+#i'', ''<br />'', $string); landing:

Ejemplo en vivo: http://codepad.viper-7.com/UfqrIQ

3. Salta sobre el código con if(false) o if(0) :

$string=''Hello<br>World<br><br />World<br><br><br>Word!''; if(0){ $string = preg_replace(''#(<br/s*/?>)+#i'', ''<br />'', $string); }

Prueba: http://codepad.viper-7.com/wDg5H5


Otra idea: Escape the > (y the / , si desea usar un /*...*/ comentario):

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

Un escape "innecesario" es ignorado por el motor de expresiones regulares, pero es útil en este caso (por las razones explicadas en las otras respuestas).


Usa un truco: concatenar la cuerda de dos piezas. De esta forma, la etiqueta de cierre se corta en dos y ya no es una etiqueta de cierre válida. ''?>'' --> ''?''.''>''

En tu código:

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

Esto hará que // comentarios funcionen.

Para que /* */ funcionen los comentarios, tendrías que dividir la secuencia */ también:

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

Recuerde, a veces, a pesar de que el todo es más que la suma de sus partes, pero ser codicioso es malo, hay momentos en que es mejor dejarlo con menos . :)


La forma más fácil

Crea una variable separada para mantener tu expresión regular; de esta manera, simplemente puede comentar la declaración preg_replace() :

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

Arreglar usando clases de caracteres

Para corregir los comentarios de línea, ¿puedes dividir ?> Poniendo > dentro de una clase de personaje así:

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

Para corregir los comentarios de bloque, puede aplicarlo a / :

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

Para corregir ambos estilos de comentarios, puede poner / y > en su propia clase de caracteres.

Arreglar usando el modificador /x

El modifier x , también PCRE_EXTENDED como PCRE_EXTENDED , ignora espacios y saltos en una expresión regular (excepto cuando ocurren dentro de una clase de caracteres); esto hace posible agregar espacios para separar los personajes problemáticos. Para corregir ambos estilos de comentarios:

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


Por qué tus intentos no funcionaron:

// $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

Que funciona:

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

Promover...

Después de lo anterior, debería poder usar /* para comentar la línea. Si deja el ?> Intacto, // posiblemente no pueda comentar una línea completa. El texto siguiente ?> Podría ser html, que está fuera del control del intérprete de PHP, por lo que no funcionaría.

De php.net/manual/en/language.basic-syntax.comments.php

Los estilos de comentarios de "una línea" solo hacen comentarios al final de la línea o al bloque actual de código PHP, lo que ocurra primero. Esto significa que el código HTML después de // ...?> O # ...?> Se imprimirá:?> Rompe el modo PHP y vuelve al modo HTML, y // o # no pueden influir en eso.