我在php中的代码是:
while(preg_match('%(<span style="color: green;">)(?:\s+)?(</.*?>)%i', $result2)==1){
$result2 = preg_replace('%(<span style="color: green;">)(?:\s+)?(</.*?>)%i', '$2 $1', $result2);
}
现在我有一个输入,例如:
<span style="color: green;"></p></i>
我的代码所做的是,每当任何标记在此span绿色标记之后关闭时,它们都会放在span之前。所以上面输入的输出是:
</p></i><span style="color: green;">
我希望如果在此span绿色标记之后有任何span标记关闭,则应忽略该标记,并且应首先放置所有其他结束标记。 示例输入:
<span style="color: green;"></p></span></i>
输出:
</p></i><span style="color: green;"></span>
有人可以帮我改变这个吗?
答案 0 :(得分:1)
通常,对于某些正则表达式实现,您可以使用前瞻机制,在匹配/替换模式中看起来像(?!</span>)(</.*?>)
而不仅仅是(</.*?>)
。
否则,请检查Regex - how to match everything except a particular pattern,因为它解决了标准和非标准实施的一般问题。
你也可以在正则表达式上少一点,只要检查你找到的标签是否匹配,如果这样就打破了循环(如果我理解你的想法)。
编辑:如果您希望在跨度关闭后继续移动标记,则只需添加到已接受的“内容”,例如:
http://sandbox.onlinephpfunctions.com/code/8177a9afbdd5ac7c1660679d9cb362a9b48c29a4
您可能希望在span内容中接受更多内容,例如\w+
(您的代码完全失去它),如果您想要许多跨度结束标记,您需要使其更通用,但其背后的想法是相同的