如何在preg_replace中的模式中使用正则表达式特殊字符

时间:2019-07-13 13:15:40

标签: php regex preg-replace

我正在尝试将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);

1 个答案:

答案 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';