提问者:小点点

使用php preg_replace替换整个字符串,如果字符串是较长字符串的一部分,则不替换


正则表达式对我来说是一个全新的概念,为了测试的目的,我对表达式进行了大量的搜索,结果是:

preg_replace('/\b0.00%\b/','- ', '0.00%')

当我想要的是-时,它生成0.00%

使用preg_replace('/\b0.00%\b/‘,'-','50.00%')生成50.00%,这是我想要的-所以这很好。

但是很明显,表达式的工作方式并不是这样,在第一个示例中,将0.00%替换为-

我可以用if(){}来解决测试字符串的长度/内容的问题,但我认为replace将是最有效的


共2个答案

匿名用户

%后面的单词边界要求在其后面出现单词字符(字母,数字或_),因此这里不会发生替换。

您需要用在(?<!\w)(?!\w)lookaround的帮助下定义的明确边界替换单词边界,如果关键字前面或后面都是单词字符,则这些lookaround将导致匹配失败:

$value='0.00%';
$str = 'Price: 0.00%';
echo preg_replace('/(?<!\w)' . preg_quote($value, '/') . '(?!\w)/i', '- ', $str);

请参阅PHP演示

输出:价格:-

匿名用户

preg_replace有三个参数,您可能已经知道了。 要匹配的正则表达式模式,替换值和要搜索的字符串(按此顺序)。

您的preg_replace正则表达式模式似乎在您要查找的值0.00%的两端都有它要查找的单词边界\b,这实际上不应该是需要的。 在我看来,这有点像一个bug,尤其是当我将它插入到我使用的regex网站时。 那里很好用。 它可能有一个有点奇怪的查询,因此您可能想尝试不使用\b,而尝试使用字符串开头的^和字符串结尾的字符$