Cómo escapar correctamente una barra diagonal inversa para que coincida con una barra diagonal inversa literal en patrones de expresiones regulares de PHP comillada y doble comilla

Para que coincida con una barra invertida literal, muchas personas y el manual de PHP dicen: Siempre escapúpela, como este \\\\

Nota :

Las cadenas PHP simples y dobles tienen un significado especial de barra invertida. Por lo tanto, si \ tiene que coincidir con una expresión regular \\ , entonces "\\\\" o '\\\\' deben usar en el código PHP.

Aquí hay un ejemplo de cadena: \test

 $test = "\\test"; // outputs \test; // WON'T WORK: pattern in double-quotes double-escaped backslash #echo preg_replace("~\\\t~", '', $test); #output -> \test // WORKS: pattern in double-quotes with triple-escaped backslash #echo preg_replace("~\\\\t~", '', $test); #output -> est // WORKS: pattern in single-quotes with double-escaped backslash #echo preg_replace('~\\\t~', '', $test); #output -> est // WORKS: pattern in double-quotes with double-escaped backslash inside a character class #echo preg_replace("~[\\\]t~", '', $test); #output -> est // WORKS: pattern in single-quotes with double-escaped backslash inside a character class #echo preg_replace('~[\\\]t~', '', $test); #output -> est 

Conclusión

  • Si el patrón tiene una comilla simple, una barra diagonal inversa tiene que ser doblemente escapada \\\ para que coincida con un literal \
  • Si el patrón tiene comillas dobles, depende de si la reacción está dentro de una clase de carácter donde debe al menos tener doble escape \\\ fuera de una clase de carácter. Tiene que ser triplemente escapado \\\\

¿Quién puede mostrarme una diferencia, donde una barra invertida de doble escape en un patrón de una sola cita, por ejemplo, '~\\\~' , coincidiría con algo diferente de una barra invertida de triple escape en un patrón de doble cita, por ejemplo, "~\\\\~" o fallar.

¿Cuándo / por qué / en qué situación sería incorrecto utilizar un doble escape \ en un patrón de una sola cita, por ejemplo, '~\\\~' para hacer coincidir una barra diagonal inversa literal?

Si no hay respuesta a esta pregunta, continuaría utilizando siempre una barra invertida de doble escape \\\ en un patrón de expresiones regulares de PHP entre comillas para que coincida con un literal \ porque es posible que no haya nada de malo en ello.

Un carácter de escape ( \ ) se considera un carácter de escape tanto por el analizador de PHP como por el motor de expresión regular (PCRE). Si escribe una sola barra invertida, el analizador de PHP lo considerará un carácter de escape. Si escribe dos barras diagonales inversas, el analizador de PHP lo interpretará como una barra invertida literal. Pero cuando se utiliza en una expresión regular, el motor de expresión regular lo recoge como un carácter de escape. Para evitar esto, debe escribir cuatro caracteres de barra invertida, dependiendo de cómo cite el patrón.

Para entender la diferencia entre los dos tipos de patrones de cotización, considere las siguientes dos sentencias var_dump() :

 var_dump('~\\\~'); var_dump("~\\\\~"); 

Salida:

 string(4) "~\\~" string(4) "~\\~" 

La secuencia de escape \~ no tiene un significado especial en PHP cuando se usa en una cadena de una sola cita. Tres barras diagonales inversas también funcionan porque el analizador de PHP no conoce la secuencia de escape \~ . Entonces \\ se convertirá en \ pero \~ se mantendrá como \~ .

Cual deberías usar:

Para mayor claridad, siempre usaría ~\\\\~ cuando quiera hacer coincidir una barra invertida literal. El otro también funciona, pero creo que ~\\\\~ es más claro.

No hay diferencia entre el escape real de la barra en cadenas simples o dobles entre comillas en PHP, siempre que lo haga correctamente. El motivo por el que obtienes un TRABAJO EN PARADA en tu primer ejemplo es, como se señala en los comentarios, que se expande \ t al carácter meta de la pestaña.

Cuando usa solo tres barras diagonales inversas, la última en su secuencia de una sola cita se interpretará como \ ~, que en lo que respecta a cadenas sueltas, se dejará como está (ya que no coincide con una secuencia de escape válida) . Sin embargo, es solo una coincidencia que esto se analizará como espera en este caso, y no tendrá algún tipo de efecto secundario (es decir, \\\ ‘no se comportaría de la misma manera).

La razón de todo el escape es que la expresión regular también necesita barras invertidas escapadas en ciertas situaciones, ya que también tienen un significado especial allí. Esto lleva a la gran cantidad de barras invertidas una detrás de la otra, como \\\\ (que toma ocho barras invertidas para el analizador de rebajas, ya que una vez más agrega otro nivel de escape).

Afortunadamente eso lo aclara, ya que parece confundido con respecto al manejo de las barras diagonales inversas en cadenas de comillas simples / dobles más que el comportamiento en la expresión regular en sí (que será la misma independientemente de “o”, siempre y cuando se escape correctamente).