我正在尝试编写一个正则表达式来将mm 3 更改为mL:
<?php
$match = 'mm<sup>3</sup>';
if(preg_match('/\b(mm<sup>3</sup>)\b/', $match))
{
$replacement = 'ml';
$replac = preg_replace('/\b(mm<sup>3</sup>)\b/', $replacement, $match);
echo $replac;
}
?>
但我的正则表达式不捕获$match
变量中的内容,并且不输出$replac
值。我做错了什么?
答案 0 :(得分:2)
变化:
if(preg_match('/\b(mm<sup>3</sup>)\b/',$match))
为:
if(preg_match('#\bmm<sup>3</sup>\b#',$match))
,同样在preg_replace
电话中。
由于您的正则表达式包含/
,因此您需要将其转义或在正则表达式周围使用不同的分隔符。
也没有必要使用括号,因为你没有对这些组做任何事情。
答案 1 :(得分:1)
你需要使用preg_quote
来摆脱你的正则表达式,或者使用不同的分隔符(通常使用#)。
此外,&gt;之后的\ b分隔符没有必要,也没有括号,因为你似乎没有捕捉;你基本上做了一个更昂贵的str_replace
。
最后,你可以一举一动。如果没有匹配,什么都不会发生。
<?php
$match = 'mm<sup>3</sup>';
$replacement='ML';
$replac = preg_replace('#\\bmm<sup>3</sup>#',
$replacement,
$match);
echo $replac;
?>
如果你想挑剔,我想你也应该用'ml'代替,而不是'ML': - )
(用于替换多个字符串,preg_replace
supports arrays)。
注意:除非您确定要替换正确的HTML,否则您应该尝试
$match = 'mm\\s*<sup>\\s*3\\s*</sup>';
为了捕捉 mm 3 等类似的,除了 mm 3 (在某些情况下,可能看起来很相似,有些编辑可能会使用或自动“纠正”任何一种形式到另一种形式。)