// PHP 5.4.1
// Either three or four \ can be used to match a '\'.
echo preg_match('/\\\/', '\\'); // 1
echo preg_match('/\\\\/', '\\'); // 1
// Match two backslashes `\\`.
echo preg_match('/\\\\\\/', '\\\\'); // Warning: No ending delimiter '/' found
echo preg_match('/\\\\\\\/', '\\\\'); // 1
echo preg_match('/\\\\\\\\/', '\\\\'); // 1
// Match one backslash using a character class.
echo preg_match('/[\\]/', '\\'); // 0
echo preg_match('/[\\\]/', '\\'); // 1
echo preg_match('/[\\\\]/', '\\'); // 1
Al utilizar tres barras invertidas para que coincida con un '\'
el patrón de abajo se interpreta como que coincida con un '\'
seguido de un 's'
.
echo preg_match('/\\\\s/', '\\ '); // 0
echo preg_match('/\\\\s/', '\\s'); // 1
Al usar cuatro barras invertidas para que coincida con un '\'
el patrón de abajo se interpreta como que coincida con un '\'
seguido por un carácter de espacio.
echo preg_match('/\\\\\s/', '\\ '); // 1
echo preg_match('/\\\\\s/', '\\s'); // 0
Lo mismo se aplica si dentro de una clase de caracteres.
echo preg_match('/[\\\\s]/', ' '); // 0
echo preg_match('/[\\\\\s]/', ' '); // 1
Ninguno de los anteriores resultados se ven afectados por encerrar las cadenas en doble en vez de comillas simples.
Conclusiones:
Ya sea dentro o fuera de una clase de caracteres entre corchetes, una barra invertida literal se pueden combinar usando sólo tres barras invertidas '\\\'
a menos que el siguiente carácter en el patrón también se barra invertida, en cuyo caso la barra invertida debe ser emparejado usando cuatro barras invertidas.
Recomendación:
Siempre usa cuatro barras invertidas '\\\\'
en un patrón de expresión en la búsqueda para que coincida con una barra invertida.
Escape sequences.
Entonces, ¿en ambos casos, el motor de expresiones regulares lo considera una sola barra invertida? –
'\ [\]' sería un escape del corchete de cierre. '[\\]' sería una barra invertida en una clase de caracteres. una sola clase de char es bastante inútil, no sería diferente de tener un simple '\\\'. –