©
This document uses PHP Chinese website manual Release
(PHP 4, PHP 5)
preg_quote — 转义正则表达式字符
$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: 此函数可安全用于二进制对象。
[#1] ian at broster dot co dot uk [2014-09-08 14:22:10]
Note that slash '/' is not one of the special characters, the italic writing of the list above makes pipe '|' look like '/'.
[#2] zooly [2009-07-21 01:07:11]
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
[#3] frostschutz [2009-03-20 02:01:13]
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 [].
[#4] krishoog at gmail dot com [2008-10-13 07:51:57]
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.
[#5] bizzigul at hotmail dot fr [2008-07-30 09:10:07]
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...
[#6] Anonymous [2007-12-26 15:13:11]
Wondering why your preg_replace fails, even if you have used preg_quote?
Try adding the delimiter / - preg_quote($string, '/');