barra inversa extra que se necesita en el patrón de PHP de expresiones regulares

StackOverflow https://stackoverflow.com/questions/2145804

  •  23-09-2019
  •  | 
  •  

Pregunta

Cuando se prueba una respuesta para pregunta de otro usuario me encontré con algo que yo no entender. El problema fue la de sustituir todos los caracteres \t \n \r literales de una cadena con un solo espacio.

Ahora, el primer patrón que probé fue:

/(?:\\[trn])+/

que, sorprendentemente, no funcionó. Probé el mismo patrón en Perl y funcionó bien. Después de algún ensayo y error descubrí que quiere PHP 3 o 4 barras invertidas para ese patrón a la altura, como en:

/(?:\\\\[trn])+/

o

/(?:\\\[trn])+/

- estos patrones para mi sorpresa - ambos trabajo. ¿Por qué son esas barras invertidas adicionales necesarios?

¿Fue útil?

Solución

Es necesario 4 barras invertidas para representar 1 en expresiones regulares, ya que:

  • 2 barras invertidas se utilizan para unescape en una cadena ("\\\\" -> \\)
  • 1 barra invertida se utiliza para la representación no literal en el motor de expresiones regulares (\\ -> \)

A partir del documento PHP,

  

escapar de cualquier otro personaje dará lugar a la barra invertida ser impresa también 1

Por tanto, para \\\[,

  • 1 barra invertida se utiliza para la representación no literal la \, una estancia porque \[ no es válido ("\\\[" -> \\[)
  • 1 barra invertida se utiliza para la representación no literal en el motor de expresiones regulares (\\[ -> \[)

Sí funciona, pero no es una buena práctica.

Otros consejos

Sus obras en Perl Dado que se transfieren que directamente como patrón de expresión /(?:\\[trn])+/

pero en php, tiene que pasar por la cadena, por lo que la necesidad adicional de escapar de barra invertida en sí.

"/(?:\\\\[trn])+/"
  

La expresión regular \ para que coincida con una sola   barra invertida se convertiría en '/ \\\\ /' como una    PHP preg cadena

La expresión regular es solo /(?:\\[trn])+/. Pero ya que se necesita para escapar de las barras invertidas en las declaraciones de cuerda, así, cada barra invertida debe expresarse con \\:

"/(?:\\\\[trn])+/"
'/(?:\\\\[trn])+/'

A sólo tres teclas de retroceso hacen también con el trabajo debido a que PHP no conoce la secuencia de escape \[ y lo ignora. Así \\ se convertirá en \ pero \[ permanecerá \[.

Uso str_replace!

$code = str_replace(array("\t","\n","\r"),'',$code);

debe hacer el truco

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top