2011-09-10 12 views
10

http://php.net/manual/en/function.preg-quote.php:¿Por qué tenemos que escapar del! < >: = - in php expresiones regulares?

Los caracteres especiales de expresiones regulares son:. \ + *? [^] $() { } =! <> | : -

Sin embargo this page dice que los caracteres especiales son [ \^$ . | ? * + ()

Ok sé que la primera página es específicamente sobre las expresiones regulares de PHP. Sin embargo ¿por qué necesitamos para escapar de la !, <, >, :, =, -?

Se ha intentado realizar una preg_match sin escapar <, >, - y ! y todo está funcionando perfectamente.

Respuesta

5

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.

+0

¿por qué 'preg_quote' se les escapa si no necesitan escaparse? cuál es el truco ? – Pacerier

+0

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. –

+0

¿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

4

La página se vincula a que llevará por título "sintaxis básica de expresiones regulares". Hay un enlace a una página titulada "advanced regex syntax". Aquí se usan todos los caracteres adicionales que especifique.

  • ! se utiliza para los símbolos de anticipación negativos y lookbehinds
  • < se utiliza para lookbehinds
  • > se utiliza para grupos atómicos
  • : se utiliza para establecer banderas por sólo una parte de una expresión regular
  • = se utiliza para los símbolos de anticipación positivos y lookbehinds
  • - se utiliza para el carácter r anges y banderas de ajuste
+0

pero ¿por qué tenemos que escapar de ellos? ¿por qué 'preg_quote' se les escapa? Aunque no los escapé, todo está funcionando bien. – Pacerier

+0

@Pacerier porque puede estar insertando solo parte de una expresión regular. Las circunstancias en las que sería un problema son bastante oscuras, pero no inconcebibles. – lonesomeday

+0

¿podría dar un ejemplo (posiblemente en cuestión editar thx) cómo no escapar de un! o < or > va a fallar? porque sí, es inconcebible para mí en este momento. – Pacerier

1

Estos caracteres se utilizan en expresiones negativas/positivas look-behind/ahead/around. Por ejemplo:

/^foo(?<!z)bar$/ 

Consulte here para obtener más información.

3

Un guión es un carácter especial dentro de las clases de caracteres:

[a-zA-Z0-9] 

Los otros tienen importancia dentro de los grupos de los partidos, por ejemplo para la búsqueda hacia delante/búsqueda hacia atrás:

(?<=foo) 
(?!bar) 

Estoy de acuerdo con usted en que ninguno de estos deben ser escapados. Una vez que se han escapado los paréntesis y los corchetes, estos otros personajes pierden su significado especial.

+0

¿por qué 'preg_quote' se les escapa si no necesitan escaparse? cuál es el truco ? – Pacerier

+0

No hay trampa. Esos personajes no necesitan ser escapados. Quien escribió ese método estaba siendo demasiado entusiasta. –

1

Muchos personajes son especiales solo en un contexto determinado. De los básicos, algunos ejemplos:

/-/  # dash 
/[a-z]/ # range 
/[-a-z]/ # a-z or dash 

/[^]/  # literal 
/^/  # meta-character 

/!/  # literal 
/(?!...)/ # meta-character 
Cuestiones relacionadas