如果列表标记位于一组span标记之间,则将其替换为某些内容

时间:2015-11-12 06:22:37

标签: php html regex

现在我使用preg_replace将li标签替换为我的替换,如果li和/ li都位于2 span开始和结束标签之间,但问题是,例如我的输入:

<span style="background-color:green"> <li> one </li> </span> 
<li> second </li> <span style="background-color:green"> <li>  new  </li></span>

输出:

<span style="background-color:green"> <replacement> one </li> </span> 
<replacement> second </li> <span style="background-color:green"> replacement new 
</li> </span>

第二次替换是我实际上不想要的东西。已创建的逻辑肯定是当它位于span开始和结束标记之间时,因此根据逻辑它工作正常,因为它在开始和结束时看到跨越开始和结束标记,并且两者都打开和关闭也在它里面。但我只是想要,如果li打开和关闭标签是跨度打开和关闭标签的一部分,那么它应该被替换,否则不会。 我要求的输出:

<span style="background-color:green"> <replacement> one </li> 
</span> <li> second </li> <span style="background-color:green"> replacement new 
</li> </span>

我的PHP代码是:

preg_replace('/(<span style="background-color:green".+>.+)(<li>)(.+<\/li>.+<\/span>)/', '$1 replacement $3', $myinput);

1 个答案:

答案 0 :(得分:1)

您的正则表达式正在考虑HTML中最后<li>之前的<span>,请阅读我对该问题的评论。您始终可以在PHP Live Regex或任何其他类似服务上测试您的正则表达式。

preg_replace("/(<span\sstyle=\"background-color:green\">)\s(<li>)(.+?)(<\/li>)/i", "$1<replacement>$3</replacement>", $myinput);

\s匹配任何空格,i选项最终是为了使匹配不区分大小写。您还可以包含m选项,以告知它是一个多行字符串。阅读documentation中的更多内容。

一切都很直接。如果您已经知道正则表达式,则无需解释。查看documentation

编辑:代码中可能需要进行微小修改以处理输出中的空白区域,我认为可以由您更正。无论如何,只要正则表达式有效,我就不会关心它。

EDIT2:在作者发表评论后仔细阅读问题,不需要更改<li>。此外,还需要考虑<span><li>之间的任何单词/非单词字符。为此,可以使用下面的内容:

preg_replace("/(<span\sstyle=\"background-color:green\">)(.+?)(<li>)(.+?)(<\/li>)/", "$1$2 replacement $4$5", $input_lines);