想知道为什么你的 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 现在可以为空。 |
示例 #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);
?>
注意: 此函数是二进制安全的。
我发现,除了转义特殊正则表达式字符外,preg_quote() 还将 NUL 字节编码为其八进制表示形式
<?php
var_dump(preg_quote("\0"));
?>
输出
string(4) "\000"
要转义具有特殊意义的字符,例如: .-[]() 等,请使用 \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 被引用
--- 输出 ---
要对模式的外观有更高层次的控制,请尝试 T-Regx
Pattern::inject('This is (my|our) pattern: @', [$_GET['name']]);
如果您发现自己过度使用 preg_quote(),这可能预示着您可能需要使用 T-Regx 库中的预备模式:https://t-regx.com/docs/handling-user-input