在php中跨度打开标记之前忽略标记并放置所有结束标记

时间:2015-10-27 15:04:38

标签: php html-parsing preg-replace

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

有人可以帮我改变这个吗?

1 个答案:

答案 0 :(得分:1)

通常,对于某些正则表达式实现,您可以使用前瞻机制,在匹配/替换模式中看起来像(?!</span>)(</.*?>)而不仅仅是(</.*?>)

否则,请检查Regex - how to match everything except a particular pattern,因为它解决了标准和非标准实施的一般问题。

你也可以在正则表达式上少一点,只要检查你找到的标签是否匹配,如果这样就打破了循环(如果我理解你的想法)。

编辑:如果您希望在跨度关闭后继续移动标记,则只需添加到已接受的“内容”,例如: http://sandbox.onlinephpfunctions.com/code/8177a9afbdd5ac7c1660679d9cb362a9b48c29a4 您可能希望在span内容中接受更多内容,例如\w+(您的代码完全失去它),如果您想要许多跨度结束标记,您需要使其更通用,但其背后的想法是相同的