正则表达式不像预期那样匹配

时间:2011-11-09 21:30:47

标签: php regex

这是一个整体简单的正则表达式....

$text = preg_replace('#<sup>'.$key.'(\D*)(?=</sup>)#s', "<sup>".$val."</sup>\\1", $text);

我正在尝试匹配<sup>[insert integer]</sup>之间的任何内容,并移动</sup>内不应该存在的任何内容。问题是,<sup>122</sup>

时它甚至不匹配$key = 122

这里有什么我明显遗失的吗?

我的数据样本:

ParagraphStyletablebullet><t name=Normal>Office &amp; home visits  <i>(includes retail health clinic &amp; online clinic visit )</i></t></p>|$25/visit <sup><br></sup>(<i>deductible waived</i>) <sup>2 aSDF</sup>|30%||||

2 个答案:

答案 0 :(得分:1)

我不确定你是如何用PHP写的,我也不确定你需要什么:),但这就是我使用“The Regex Coach”

正则表达式:

(<sup>)(\d*)(.*?)(</sup>)

示例字符串:

ParagraphStyletablebullet><t name=Normal>Office &amp; home visits  <i>
(includes retail health clinic &amp; online clinic visit )</i></t>
</p>|$25/visit <sup><br></sup>(<i>deductible 
waived</i>) <sup>2 aSDF</sup>|30%||||

替换字符串:

\1\2\4\3

替换结果:

ParagraphStyletablebullet><t name=Normal>Office &amp; home visits  <i>
(includes retail health clinic &amp; online clinic visit )</i></t>
</p>|$25/visit <sup></sup><br>(<i>deductible 
waived</i>) <sup>2</sup> aSDF|30%||||

答案 1 :(得分:0)

我认为它不起作用,因为你的样本中只有<sup>2 ASD</sup>。否则,正则表达式应该适用于您的样本。

可能存在嵌套<sup>122 ASD <sup> af </sup> </sup>

的问题

但那是html解析或者只是它的文本,也许这不是问题。可以使用Perl或C#正则表达式引擎进行递归。如果是我,我会重做正则表达式,不允许嵌套<sup>

$text = preg_replace(
"~<sup>$key((?:(?!\\d|<sup>).)*)</sup>~s",  
"<sup>$val</sup>$1",  $text  );

也可能存在其他问题。