2011-02-08 20 views
14

Duplicar posible:
Is there a PHP function that can escape regex patterns before they are applied?Escapar cadena para su uso en la expresión regular

Quiero usar una cadena almacenada en una variable en una expresión regular. ¿Cuál es la mejor manera (en PHP) para escapar de una cadena para usar en una expresión regular (PCRE)?

Por ejemplo,

$text = 'm/z'; // this is the text I want to use as part of my regular expression 
$text_regexp = '#' . $text . '#i'; // this is my regular expression 

daría

$text_regexp = '#m/z#i'; 

Pero sería deseable que la siguiente expresión regular:

$text_regexp = '#m\/z#i'; 

Este es un ejemplo artificial, pero quería ilustrar el punto simplemente.

Respuesta

36

preg_quote

Del manual:

pone una barra invertida delante de cada personaje que es parte de la sintaxis expresión regular

También puede pasar el delimitador como el segundo parámetro y también será escapado. Sin embargo, si usa # como delimitador, no es necesario que escape /

+0

Gracias por la respuesta rápida. – Tomba

+0

De nada. Encantado de ayudar. – webbiedave

4

Compruebe this. Puede usar preg_quote() ;.

+0

Gracias por la respuesta rápida. – Tomba

5

Todas estas respuestas son correctas, sólo los metachars necesita ser escapado. Es una lástima que php no tenga un operador de expresiones regulares como preg_match ([operator]/$ var /) por lo que los delimeters podrían ser el agente de cotización. De esta forma, el delímetro no debería ser citado en un $ var externo. (Perl tiene esto con operadores m //, s /// o = ~)

La cuota_preg es una buena manera de hacer esto, desafortunadamente, algunas veces quiere hacer coincidir el literal '\ char' sin que se escape a ' \ char 'por ejemplo, y escapa del resto. No hay muchas opciones con preg_quote().

Literalmente puede configurar sus propias funciones de php que citan metacars (o quitar una cita después de preg_quote()).

como reemplazar todo /([{}\[\]()^\$.|*+?\\<>$delim])/ con \\$1 o algo así. Establezca $ delim, y/o elimine posiblemente el escape o cualquier otro metacars que no quiera que se escape.

Sólo mi $ .02

Cuestiones relacionadas