【问题标题】:Replacing list tag with something if it lies in between a group of span tags如果列表标签位于一组跨度标签之间,则将其替换为某物
【发布时间】:2025-12-16 04:20:03
【问题描述】:

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

第二个替换是我实际上不想要的东西。已经创建的逻辑肯定是当它位于 span 开始和结束标记之间时,所以根据逻辑它工作正常,因为它在开始和结束时看到 span 开始和结束标记,并且 li 开始和结束关闭也在里面。但我只想说,如果 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);

【问题讨论】:

  • 您的正则表达式的问题在于,当您在其中包含关闭 &lt;/span&gt; 以匹配时,代码假定第一个打开 &lt;span&gt; 和最后关闭 &lt;/span&gt; 替换每个 &lt;li&gt; 为替换。
  • 另外,你并没有告诉函数替换&lt;/li&gt;。所以你需要两个修复,从正则表达式中删除&lt;/span&gt; 并将&lt;/li&gt; 替换为replacement。请参阅下面的答案。
  • 我只需要用
  • 替换
  • ,我不想替换 /li
  • 我的错,没有仔细阅读问题。查看并编辑我的答案。
  • 顺便说一句,我没有得到你的 HTML!你为什么要把&lt;li&gt;放在&lt;span&gt;里面。前者是块元素,而后者是内联元素......但这是一个完全不同的主题,您需要研究......
  • 标签: php html regex


    【解决方案1】:

    您的正则表达式正在考虑 HTML 中最后一个 &lt;span&gt; 之前的每个 &lt;li&gt;,请阅读我对问题的评论。您可以随时在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:在作者发表评论后仔细阅读问题,关闭&lt;li&gt; 无需更改。此外,需要考虑&lt;span&gt;&lt;li&gt; 之间的任何单词/非单词字符。为此,可以使用以下内容:

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

    【讨论】:

    • 如果span和li之间有可选字符或特殊字符怎么办?我应该使用 ?\w*?\W*??我已将 替换为 $4 ?\s*?\w*\W* 可以吗?因为有可能存在任何特殊字符,任何字符或中间的任何空格
    • preg_replace("/(&lt;span\sstyle=\\"background-color:green\\"&gt;)(.+?)(&lt;li&gt;)(.+?)(&lt;\/li&gt;)/", "$1$2 replacement $4$5", $input_lines);
    • @MariumMalik 只需使用(.+?) 而不是\s 来捕获所有内容,然后相应地修改您的替换字符串。请参阅edit2。
    • 但我还有一个担心,即使在 span 之前没有关闭 li 标签,它仍然会替换 li。关闭跨度后,可能会有关闭 li 标签,所以可能正在考虑这些。
    • 在标签之前除了之外的任何东西,我认为这是我们需要做的
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签