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