我正在尝试将2.0替换为堆栈,
但以下代码将2008替换为2.08
以下是我的代码:
$string = 'The story is inspired by the Operation Batla House that took place in 2008 ';
$tag = '2.0';
$pattern = '/(\s|^)'.($tag).'(?=[^a-z^A-Z])/i';
echo preg_replace($pattern, '2.0', $string);
答案 0 :(得分:1)
使用preg_quote
并确保将正则表达式定界符作为第二个参数传递:
$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);
该字符串未修改。参见the PHP demo。此处的正则表达式定界符为/
,因此它作为第二个参数传递给preg_quote
。
请注意,由于您在字符类中添加了第二个[^a-z^A-Z]
,因此^
可以匹配除ASCII字母和^
以外的任何字符。我将[^a-z^A-Z]
更改为[^a-zA-Z]
。
此外,开头的捕获组可能会被后面的单个回退(?<!\S)
取代,这将确保您的匹配仅发生在字符串开头或空格之后。
如果您希望在字符串的末尾也匹配,请用(?=[^a-zA-Z])
(需要将一个{替换为当前位置右边的字母以外的一个字符)替换(?![a-zA-Z])
字符,而不是当前位置右侧的字母或字符串结尾。
所以,使用
$pattern = '/(?<!\S)' . preg_quote($tag, '/') . '(?![a-zA-Z])/i';
另外,请考虑使用明确的单词边界
$pattern = '/(?<!\w)' . preg_quote($tag, '/') . '(?!\w)/i';