匹配mm <sup> 3 <sup> </sup> </sup>的正则表达式模式

时间:2013-12-10 07:23:22

标签: php regex

我正在尝试编写一个正则表达式来将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值。我做错了什么?

2 个答案:

答案 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 (在某些情况下,可能看起来很相似,有些编辑可能会使用或自动“纠正”任何一种形式到另一种形式。)