现在我使用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);
答案 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);