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

使用php preg_replace替换整个字符串,如果字符串是较长字符串的一部分,则不替换,php,regex,preg-replace,Php,Regex,Preg Replace,正则表达式对我来说是全新的,为了测试的目的对我的表达式进行了大量搜索,结果如下: preg_replace('/\b0.00%\b/','- ', '0.00%') 当我想要的是-时,它会产生0.00% 使用preg\u replace('/\b0.00%\b/'、'-'、'50.00%')产生50.00%,这正是我想要的-所以这很好 但很明显,表达式的工作方式并非如此,在第一个示例中,将0.00%替换为- 我可以考虑使用if(){}测试字符串长度/内容的变通方法,但我认为替换将是最有效的后%

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

preg_replace('/\b0.00%\b/','- ', '0.00%')
当我想要的是
-
时,它会产生
0.00%

使用
preg\u replace('/\b0.00%\b/'、'-'、'50.00%')
产生
50.00%
,这正是我想要的-所以这很好

但很明显,表达式的工作方式并非如此,在第一个示例中,将
0.00%
替换为
-

我可以考虑使用
if(){}
测试字符串长度/内容的变通方法,但我认为替换将是最有效的

%
需要一个单词char(字母、数字或
)显示在它的正后方,因此这里没有替换

您需要使用通过
(?!\w)和
(?!\w)
查找框定义的明确边界替换单词边界,如果关键字前面或后面有单词字符,则该查找框将无法匹配:

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

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


您的preg_replace regex模式似乎在您要查找的
0.00%
值的两端都有word boundries
\b
,这应该不是真正需要的。这在我看来有点像一个bug,特别是当我将其插入到我使用的程序中时。它在那里工作正常。可能有点奇怪的querk因此,您可能希望在不使用
\b
的情况下尝试它,并尝试类似字符串
^
的开头和字符串的结尾
$

您不理解单词边界是什么。如果需要匹配
%
后面跟有非单词c,则需要在结尾使用
\b
,而不是
\b
har或位于字符串末尾。
0.00%
50.00%
是否表示完整的输入字符串,或者这些值是较大字符串的一部分?到目前为止,您似乎根本不需要正则表达式。@paul%字符是字符串值的一部分,例如0.00%50.00%15.87%是完整字符串,而不是较大字符串的一部分前面或后面没有其他字符。对不起,但是使用
preg_replace
来更改整个字符串有什么意义呢?只要使用
if($s=='0.00%'){return'-';}
@WiktorStribiżew-一个理解regex的机会,并假设它在多次迭代中会更快(php生成的报告中有数千行)-你怎么看?Hi@WiktorStribiżew-这非常有效,谢谢你。我也尝试过if($s=='0.00%'){return'-';}但是这似乎会干扰复杂的嵌套计数器-因此没有机会比较性能。非常感谢你的详细理解-非常有用。