PCRE 函数
在线手册:中文 英文
PHP手册

preg_quote

(PHP 4, PHP 5)

preg_quote转义正则表达式字符

说明

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote()需要参数str并向其中 每个正则表达式语法中的字符前增加一个反斜线. 这通常用于你有一些运行时字符串 需要作为正则表达式进行匹配的时候.

正则表达式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

参数

str

输入字符串

delimiter

如果指定了可选参数delimiter, 它也会被转义. 这通常用于 转义PCRE函数使用的分隔符. /是最通用的分隔符.

返回值

返回转义后的字符串.

更新日志

版本 说明
5.3.0 字符-被增加为需要转义的.

范例

Example #1 preg_quote()示例

<?php
$keywords 
'$40 for a g3/400';
$keywords preg_quote($keywords'/');
echo 
$keywords// 返回 \$40 for a g3\/400
?>

Example #2 将文本中的单词替换为斜体

<?php
//在这个例子中, preg_quote($word)用于保持星号原文涵义, 使其不使用正则表达式中的特殊语义.

$textbody "This book is *very* difficult to find.";
$word "*very*";
$textbody preg_replace ("/" preg_quote($word) . "/",
                          
"<i>" $word "</i>",
                          
$textbody);
?>

注释

Note: 此函数可安全用于二进制对象。


PCRE 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: 转义正则表达式字符

用户评论:

billadoid at gmail dot com (12-Jan-2012 01:11)

If you need to quote everything but a wildcard, maybe this function will come handy to you:

<?php
protected function _ruleOptionIsMatched($option, $subject)
{
   
$option = preg_quote($option, '#');
   
$option = str_replace('\*', '.*', $option);

    if(
preg_match("#^$option$#", $subject))
    {
        return
true;
    }
    else
    {
        return
false;
    }
}
?>

admin at nilamo dot com (04-Aug-2010 04:21)

@zooly:

And what if $myvar = 'te\\E.t'?  It will match, when it shouldn't.  That's why you should use preg_quote().

zooly (21-Jul-2009 09:07)

To escape characters with special meaning, like: .-[]() and so on, use \Q and \E.

For example:

<?php echo ( preg_match('/^'.( $myvar = 'te.t' ).'$/i', 'test') ? 'match' : 'nomatch' ); ?>

Will result in: match

But:

<?php echo ( preg_match('/^\Q'.( $myvar = 'te.t' ).'\E$/i', 'test') ? 'match' : 'nomatch' ); ?>

Will result in: nomatch

alexc223 at NOSPAM dot googlemail dot com (15-Jun-2009 08:41)

Not sure why this note got deleted, but hey lets try again:

As of PHP 5.3, bug #47229 has been fixed and preg_quote *will* escape a hyphen (-). This may effect your code so ensure this is one thing you check when moving to 5.3.

frostschutz (20-Mar-2009 10:01)

I wanted to escape a string of characters so I could match them in [], i.e. [.,-!"§$%\\\[\]\^].

Unfortunately preg_quote does not escape the - character which has a special meaning in [], i.e. [a-z].

So I used this hack: make - the delimiter of the expression, i.e.

preg_quote(userinput, "-")
preg_replace("-[$userinput]-u", "", $str)

Apparently using a special char as a delimiter of a regular expression disables this character, i.e. even if it's escaped it's not understood as special character for the expression anymore.

so the pattern "-[a\\-z]-u" matches the characters a, - and z, and not abc...xyz.

It would be nice if preg_quote also escaped characters that have special meanings even if they have this meaning only under certain conditions, such as inside [].

krishoog at gmail dot com (13-Oct-2008 03:51)

To bizzigul at hotmail dot fr:
It's not a good practice to make somthing work *almost* all of the time. If the input contains a '`' you will still get an error. I recommend using the default delimiter ('/') and also feed this to preg_quote as second argument.

bizzigul at hotmail dot fr (30-Jul-2008 05:10)

To prevent any problems, try to always use a delimiter that will *almost* not be used inside the regex, such as ` (back quote)

for example: instead of
<?php preg_match('/foo\/bar\//',$somevar); ?>

use

<?php preg_match('`foo/bar/`',$somevar); ?>

it's that simple! like this, you won't have to bother with delimiters anymore...

Anonymous (26-Dec-2007 11:13)

Wondering why your preg_replace fails, even if you have used preg_quote?

Try adding the delimiter / - preg_quote($string, '/');