当我写下以下内容时,我收到了这样的警告,并且它与任何内容都不匹配,但我确信,$row_search['content']
包含$value
...
preg_match_all("/[^\s]*".preg_quote($value)."[^\s]*/iu", $row_search['content'], $final_matched);
WARNING:preg_match_all() [function.preg-match-all]: Unknown modifier '/' in C:\xampp\htdocs\finance\search\search.php on line 82
为什么我收到这样的警告信息?
由于
答案 0 :(得分:6)
我认为$value
包含一个斜杠/
,它不会被preg_quote
转义:
特殊正则表达式字符为:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
将您使用的分隔符传递给函数:
preg_match_all("/[^\s]*".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched);
// ---^
或使用其他分隔符。
答案 1 :(得分:4)
您应该将preg_quote($value)
更改为preg_quote($value, "/")
以逃避分隔符。
在您的示例中,如果$value
包含“(内容/其他)”,则会将其转义为“(内容/其他)”并且您的正则表达式中的此内容将为/[^\s]*\(content/other\)[^\s]*/iu
,因为您可以看到a /这将使你的正则表达式崩溃。如果您明确说“/”是分隔符,则正则表达式将为/[^\s]*\(content\/other\)[^\s]*/iu
答案 2 :(得分:2)
/
不是PCRE元字符,因此虽然您将它用作正则表达式中的分隔符,但preg_quote()
不会逃避它,因为它不会知道你正在使用它作为分隔符。你必须将其作为第二个参数传递,正如其他人所说的那样,以便它也被转义:
preg_match_all("/[^\s]*".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched);
答案 3 :(得分:0)
使用preg_quote
时将/
指定为分隔符:
preg_match_all("~/[^\s]*~".preg_quote($value, '/')."[^\s]*/iu", $row_search['content'], $final_matched);
否则,/
值中的$value
将不会被转义。