想知道为什么你的 preg_replace 失败,即使你使用了 preg_quote?
尝试添加定界符 / - preg_quote($string, '/');
(PHP 4, PHP 5, PHP 7, PHP 8)
preg_quote — 引用正则表达式字符
preg_quote() 接收 str
并将其中的每个正则表达式语法字符前都加上一个反斜杠。如果您需要在某些文本中匹配运行时字符串,并且该字符串可能包含特殊的正则表达式字符,则此功能很有用。
特殊的正则表达式字符为:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #
请注意,/
不是特殊的正则表达式字符。
注意:
请注意,preg_quote() 不适用于 preg_replace() 等的 $replacement 字符串。
str
输入字符串。
delimiter
如果指定了可选的 delimiter
,它也将被转义。这对于转义 PCRE 函数所需的定界符很有用。 /
是最常用的定界符。
返回已引用(转义)的字符串。
版本 | 描述 |
---|---|
7.3.0 | 现在对 # 字符进行引用 |
7.2.0 |
delimiter 现在可以为 null。 |
示例 #1 preg_quote() 示例
<?php
$keywords = '$40 for a g3/400';
$keywords = preg_quote($keywords, '/');
echo $keywords; // 返回 \$40 for a g3\/400
?>
示例 #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);
?>
注意: 此函数是二进制安全的。
要转义具有特殊含义的字符,例如:.-[]() 等,请使用 \Q 和 \E。
例如
<?php echo ( preg_match('/^'.( $myvar = 'te.t' ).'$/i', 'test') ? 'match' : 'nomatch' ); ?>
将导致:match
但是
<?php echo ( preg_match('/^\Q'.( $myvar = 'te.t' ).'\E$/i', 'test') ? 'match' : 'nomatch' ); ?>
将导致:nomatch
应该注意的是,正斜杠没有被转义。由于许多正则表达式都用正斜杠括起来,如果您在正则表达式中将其作为文本使用,则必须手动转义它,否则它将终止正则表达式。
特殊字符列表不完整
--- 示例代码 ---
$specials = '.\+*?[^]$(){}=!<>|:-';
for ($i = 0; $i <= 255; $i++) {
if (chr($i) !== preg_quote(chr($i))) {
printf("字符 0x%02x 引用%s\n",
$i,
(strpos($specials, chr($i)) === FALSE) ? ' (+)' : '');
} /* if */
} /* for */
--- 示例代码 ---
--- 输出 ---
字符 0x00 引用 (+)
字符 0x21 引用
字符 0x24 引用
字符 0x28 引用
字符 0x29 引用
字符 0x2a 引用
字符 0x2b 引用
字符 0x2d 引用
字符 0x2e 引用
字符 0x3a 引用
字符 0x3c 引用
字符 0x3d 引用
字符 0x3e 引用
字符 0x3f 引用
字符 0x5b 引用
字符 0x5c 引用
字符 0x5d 引用
字符 0x5e 引用
字符 0x7b 引用
字符 0x7c 引用
字符 0x7d 引用
--- 输出 ---
我发现,除了转义特殊的正则表达式字符外,preg_quote() 还将 NUL 字节编码为其八进制表示形式
<?php
var_dump(preg_quote("\0"));
?>
输出
string(4) "\000"
要对模式的外观进行更高级别的控制,请尝试使用 T-Regx
Pattern::inject('This is (my|our) pattern: @', [$_GET['name']]);