Esos personajes son meta-caracteres, pero necesitan hay escapatoria. Lo que tienen en común es que se producen en construcciones especiales de agrupamiento:
(?:...) # non-capturing group
(?=...) # positive lookahead
(?!...) # negative lookahead
(?<name>...) # named capturing groups
(?<=...) # positive lookbehind
(?<!...) # negative lookbehind
(?>...) # atomic group
Pero sólo adquieren un significado especial en este contexto. Por lo tanto, si toma cualquier cadena y escapa de todos estos caracteres: [\^$.|?*+(){
, obtendrá una expresión regular que coincidirá exactamente con la cadena carácter por carácter, porque esos otros metacaracteres nunca pueden estar en un metacontexto.
Por ejemplo, ]
es solo un metacarácter si había un [
anterior sin protección que abrió una clase de caracteres.
Del mismo modo, el -
es sólo una metacarácter en una clase de caracteres, que significa "gama", como en [a-z]
(o un literal -
como en [abc-]
.
Así que para escapar de la cadena [tag-soup]
solo necesita escapar del [
. Fuera de una clase de caracteres, ]
y -
simplemente se tratan como literales.
En resumen, si toma una cadena y escapa de todos los metacaracteres "incondicionales" ([\^$.|?*+(){
), obtendrá una expresión regular que coincidirá exactamente con la cadena carácter por carácter.
¿por qué 'preg_quote' se les escapa si no necesitan escaparse? cuál es el truco ? – Pacerier
Me parece demasiado entusiasta. Si su cadena de entrada es '(? :)', entonces '\ (\?: \)' Sería la versión correcta escapada. '\ (\? \: \)' probablemente no duele ya que en muchos sabores de expresiones regulares las secuencias de escape desconocidas simplemente se ignoran, pero algunas sí provocan errores en ellas, por lo que generalmente es una buena idea no escapar más de lo necesario. –
¿Existe incluso una situación en la que no escaparse de ellos puede fallar algo? o es seguro asumir que no fallará al 100%. – Pacerier