Use preg_quote https://www.php.net/manual/en/function.preg-quote.php并确保将正则表达式分隔符作为第二个参数传递:
$string = 'The story is inspired by the Operation Batla House that took place in 2008 ';
$tag = '2.0';
$pattern = '/(\s|^)' . preg_quote($tag, '/') . '(?=[^a-zA-Z])/i';
// ^^^^^^^^^^^^^^^^^^^^^
echo preg_replace($pattern, '2.0', $string);
字符串未被修改。看PHP 演示 https://3v4l.org/ljIdK。这里的正则表达式分隔符是/
,因此它作为第二个参数传递给preg_quote
.
注意[^a-z^A-Z]
匹配除 ASCII 字母之外的任何字符and ^
因为你添加了第二个^
在字符类中。我变了[^a-z^A-Z]
to [^a-zA-Z]
.
此外,开始时的捕获组可以替换为单个回顾,(?<!\S)
,它将确保您的匹配仅发生在字符串开头或空格之后。
如果您希望在字符串末尾也匹配,请替换(?=[^a-zA-Z])
(这需要一个字符而不是紧邻当前位置右侧的字母)(?![a-zA-Z])
(这需要一个字母以外的字符或字符串结尾紧邻当前位置的右侧)。
So, use
$pattern = '/(?<!\S)' . preg_quote($tag, '/') . '(?![a-zA-Z])/i';
另外,考虑使用明确的单词边界
$pattern = '/(?<!\w)' . preg_quote($tag, '/') . '(?!\w)/i';