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 un problema, pero necesito comentar la línea.
He intentado crear un comentario en esta línea con //
, /*
*/
y #
sin embargo ninguno de ellos el trabajo, el analizador considera etiqueta de cierre para ser 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?
<?php # echo 'simple';?>
.Respuestas:
Usa un truco: concatenar la cuerda 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 su código:
Esto hará que los
//
comentarios funcionen.Para que los
/* */
comentarios funcionen, también deberías dividir la*/
secuencia:Recuerde, a veces, aunque el todo es más que la suma de sus partes, pero ser codicioso es malo, hay veces que es mejor quedarse con menos . :)
fuente
??<
La forma más fácil
Cree una variable separada para mantener su expresión regular; de esta manera puedes simplemente comentar la
preg_replace()
declaración:Arreglar usando clases de caracteres
Para corregir los comentarios de línea, puede romper
?>
colocando>
dentro de una clase de caracteres de esta manera:Para corregir los comentarios de bloque, puede aplicarlo a
/
:Para arreglar ambos estilos de comentarios, puede poner
/
y>
en su propia clase de caracteres.Arreglar usando el
/x
modificadorEl
x
modificador , también conocido comoPCRE_EXTENDED
, ignora espacios y líneas nuevas en una expresión regular (excepto cuando ocurren dentro de una clase de caracteres); Esto permite agregar espacios para separar los caracteres problemáticos. Para arreglar ambos estilos de comentario:fuente
x
modificador :)g
) ...Por qué tus intentos no funcionaron:
Que funciona:
Más lejos...
Después de lo anterior, debería poder usar
/*
para comentar la línea. Si deja?>
intacto,//
no puede comentar una línea completa. El siguiente texto?>
podría ser html, que está fuera del control del intérprete PHP, por lo que no funcionaría.De la documentación:
fuente
Otra idea: escapar de la
>
(y la/
, si desea utilizar un/*...*/
comentario):El motor de expresiones regulares ignora un escape "innecesario", pero es útil en este caso (por las razones descritas en las otras respuestas).
fuente
¿Por qué utilizar "trucos" complicados y difíciles de leer para solucionar el problema?
?
es solo un atajo cuantificador por conveniencia, así queSimplemente use la versión larga del cuantificador
{0,1}
, significa "mínimo 0 máximo 1 ocurrencia":fuente
Algunas otras formas que vale la pena agregar al libro de trucos RegEx :
Primero, puede compactar su RegEx para:
/(<br\s*/?>)+/i
y reemplazarlo<br />
(sin necesidad de cargar el RegExP con lookaheads) y siempre terminará con el salto de línea XHMTL elegido.Otras formas de modificar su RegEx para que no active el
*/
comentario?>
final o el script final:#(<br\s*+/?+>)+#i
que básicamente significa que\s*+
si encuentra espacios en blanco, coincida con tantos como existen y manténgalo, y/?+
si encuentra una barra oblicua, ¡manténgalo!\s*
y/*
en grupos de captura =>#(<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 los comentarios es: demostración explicada
#(<br\s*+/?+>)++#i
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. Use un nowdoc :
Código en vivo: http://codepad.viper-7.com/22uOtV
Nota: un nowdoc es similar a un heredoc pero no analiza el contenido y debe tener su delimitador inicial entre
'
comillas simples'
( tenga en cuenta que el delimitador final no puede ser ideado , ¡debe ir seguido de;
una nueva línea ! )2. Salta el código con un goto :
Ejemplo en vivo: http://codepad.viper-7.com/UfqrIQ
3. Salta sobre el código con
if(false)
oif(0)
:Prueba: http://codepad.viper-7.com/wDg5H5
fuente