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


Replacing list tag with something if it lies in between a group of span tags

现在,如果li和/li都位于2个跨度的打开和关闭标记之间,我已经使用preg_replace将li标记替换为我的替换标记,但问题是,例如我的输入:

<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>

第二个替代品是我实际上不想要的东西。已经创建的逻辑肯定是,当它位于跨度打开和关闭标签之间时,所以根据逻辑,它工作得很好,因为它在开始和结束时都看到了跨度打开和闭合标签,李打开和关闭也在其中。但我只想,如果li打开和关闭标签是span打开和关闭标记的一部分,那么它应该被替换,否则就不应该被替换。我需要的输出:

<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);

您的正则表达式正在考虑HTML中最后一个<span>之前的每个<li>,请阅读我对该问题的评论。您可以随时在PHPLiveRegex或任何其他类似的服务中测试您的正则表达式。

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

's是匹配任何空白,而i选项最终是使匹配不区分大小写。您还可以包含m选项,以告知它是一个多行字符串。阅读文档中的更多信息。

一切都很顺利。如果您已经了解regex,则无需任何解释。检查文件

编辑:可能需要对代码进行细微修改,以处理输出中的空白,我认为您可以更正这些空白。无论如何,只要正则表达式有效,我就不会在乎它。

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

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