Convierta la etiqueta de cierre de PHP en un comentario

9 minutos de lectura

avatar de usuario
v1n_vampiro

Una de las líneas de mi script contiene una etiqueta de cierre de PHP dentro de una cadena. En condiciones normales, esto no causa ningún problema, pero necesito comentar la línea.

He intentado comentar esta línea con //, /* */ y # pero ninguno de ellos 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?

  • Problema divertido, pero real. Yo voto arriba

    – Voitcus

    5 de marzo de 2013 a las 9:33

  • DIOS MÍO. Al principio era escéptico ante su pregunta, listo para preguntar cuál era el problema, pero luego traté de comentar una línea con una cadena que contenía ‘?>’ y lo entendí. Esto debe agregarse a la larga lista de phptristeza.com

    – lolesco

    5 de marzo de 2013 a las 10:35

  • La utilidad de tal “característica” se explica en php.net/manual/en/language.basic-syntax.comments.phpes útil en el caso de una sola línea <?php # echo 'simple';?>.

    – lolesco

    5 de marzo de 2013 a las 11:17

  • @lolesque Gracias por ese enlace. Una buena. Uno relacionado que también cubre otros idiomas: wiki.theory.org/TuIdiomaApesta

    – Simón Forsberg

    5 de marzo de 2013 a las 11:36

  • @OndraŽižka todo lo que está haciendo es eliminar las etiquetas br repetidas. una expresión regular funciona bien para eso. El hecho de que sea malo a veces no significa que sea malo todo el tiempo.

    – Kip

    7 de marzo de 2013 a las 19:06

avatar de usuario
peterka

Usa un truco: concatena la cadena de dos piezas. De esta manera, 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á // los comentarios funcionan.

Para /* */ comentarios para trabajar, tendrías que dividir el */ secuencia también:

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

Recuerda, a veces, aunque el todo es más que la suma de sus partes – pero ser codicioso es malo, hay veces que es mejor dejarlo menos. 🙂

  • @ppeterka Wow, ni siquiera pensé en eso. Gracias.

    – v1n_vampiro

    5 de marzo de 2013 a las 9:30

  • Tuve que usar este truco en C hace 2 días para una cadena que contenía ??<

    –Ryan Amos

    5 de marzo de 2013 a las 17:21


  • Muy buena. ¿¡Por qué nunca pienso de esa manera!?

    – San

    5 de marzo de 2013 a las 18:42

avatar de usuario
Jacobo

La forma más fácil

Cree una variable separada para contener su expresión regular; de esta manera usted puede simplemente comentar el preg_replace() declaración:

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

Arreglar usando clases de personajes

Para corregir los comentarios de línea, puede dividir ?> poniendo > dentro de una clase de carácter así:

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

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

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

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

Arreglar usando el /x modificador

los x modificador – alias PCRE_EXTENDED – ignora espacios y saltos de línea en una expresión regular (excepto cuando ocurren dentro de una clase de caracteres); esto hace posible agregar espacios para separar los caracteres problemáticos. Para corregir ambos estilos de comentario:

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

  • @Cthulhu +1 (y también por la respuesta, por supuesto). Además (al menos para mí) esto hace que la expresión regular sea un poco más difícil de entender. No mucho, pero si viera esta expresión regular, diría: Hmmm, ¿qué está pasando? Pero eso es francamente y totalmente subjetivo.

    – ppeterka

    5 de marzo de 2013 a las 9:20


  • @ppeterka Estoy algo de acuerdo, así que encontré otra forma, usando el x modificador 🙂

    – Jacobo

    5 de marzo de 2013 a las 9:26

  • @Jack Nice, le daría otro +1, he aprendido algo nuevo… Sigo olvidándome de los modificadores de expresiones regulares (rara vez los uso aparte de g)…

    – ppeterka

    5 de marzo de 2013 a las 9:28

  • @Jack Gracias, aprendo cosas nuevas sobre expresiones regulares de la solución.

    – v1n_vampiro

    5 de marzo de 2013 a las 9:30

  • +1 por separar la expresión regular en una línea anterior. Mantiene la expresión regular igual, pero aún permite comentar la lógica.

    usuario764357

    22 de julio de 2013 a las 5:55

avatar de usuario
Anirudh Ramanathan

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',...
                                    ^ ^              ^ ^

Más lejos…

Después de lo anterior, debería poder usar /* para comentar la línea. Si dejas el ?> intacto, // no es posible comentar una línea completa. El texto siguiente ?> podría ser html, que es fuera del control del intérprete de PHP, por lo que no funcionaría.

De la documentación:

Los estilos de comentario de “una línea” solo comentan hasta el final de la línea o el bloque actual de código PHP, lo que ocurra primero. Esto significa que el código HTML después de // … ?> o # … ?> SE IMPRIMIRÁ: ?> sale del modo PHP y vuelve al modo HTML, y // o # no pueden influir en eso.

  • Gracias, tantas cosas que aún no sé… Es útil.

    – v1n_vampiro

    5 de marzo de 2013 a las 9:37

  • Esta publicación merecería muchos más +1… Solo por la explicación detallada.

    – ppeterka

    5 de marzo de 2013 a las 14:39


avatar de usuario
Tim Pietzcker

Otra idea: escapar de la > (y el /si desea utilizar un /*...*/ comentario):

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

El motor de expresiones regulares ignora un escape “innecesario”, pero es útil en este caso (por las razones descritas en las otras respuestas).

avatar de usuario
tallo

¿Por qué usar “trucos” complicados y difíciles de leer para solucionar el problema?

? es solo un atajo de cuantificador por conveniencia, por lo que

Solo usa la versión larga del cuantificador {0,1}significa “mínimo 0 máximo 1 ocurrencia”:

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

  • +1 esta página comienza a ser un muy buen lugar para recopilar trucos de expresiones regulares para tener en el fondo de nuestras mentes.

    – ppeterka

    7 de marzo de 2013 a las 8:51

  • @ppeterka, en realidad llamaría a todas las demás respuestas “trucos”, pero mi respuesta es solo usar la versión larga del cuantificador y no el atajo.

    – tallo

    7 de marzo de 2013 a las 9:33

  • Sin ofender, solo que en mi diccionario, usar la versión larga de una expresión en lugar del azúcar sintáctico más corto y conveniente también cuenta como un truco…

    – ppeterka

    7 de marzo de 2013 a las 9:41

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

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

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

  • Usar cuantificadores posesivos : #(<br\s*+/?+>)+#i – lo que básicamente significa para \s*+ si encontró espacios en blanco, haga coincidir tantos como hay y manténgalos, y para /?+ si encontraste una barra, ¡guárdala!
  • Encerrar \s* y /* en grupos de captura => #(<br(\s*)(/?)>)+#i

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

Y dado que nos inclinamos por el comportamiento posesivo, el RegEx más rápido que también pasa por alto el problema de los comentarios es: #(<br\s*+/?+>)++#i demostración explicada


En cuanto a comentar en situaciones difíciles

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

1. Usa un ahoradoc:

    $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

No hay té ahoradoc es similar a un heredoc pero no analiza el contenido y tiene que tener su comenzando delimitador encerrado en 'comillas simples' (tenga en cuenta que el no se puede identificar el delimitador finaldebe ir seguido de ; y un nueva línea !)

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

$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

  • +1 esta página comienza a ser un muy buen lugar para recopilar trucos de expresiones regulares para tener en el fondo de nuestras mentes.

    – ppeterka

    7 de marzo de 2013 a las 8:51

  • @ppeterka, en realidad llamaría a todas las demás respuestas “trucos”, pero mi respuesta es solo usar la versión larga del cuantificador y no el atajo.

    – tallo

    7 de marzo de 2013 a las 9:33

  • Sin ofender, solo que en mi diccionario, usar la versión larga de una expresión en lugar del azúcar sintáctico más corto y conveniente también cuenta como un truco…

    – ppeterka

    7 de marzo de 2013 a las 9:41

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad