从字符串中删除错误标签的最佳方法


Best way to remove wrong tags from string

删除错误标签的最佳方法是什么?

如果

标签包含在同一标签

中,则

标签是错误的

例如,这行

<q>+7</q> (<q><q>9</q>6</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q>

删除错误标签后:

<q>7</q> (<q>96</q><q>2</q>) <q>9</q><q>3</q><q>7</q> <q>4</q><q>2 2</q><q>4</q>

不止这个简单的例子:

:

<p>bla-bla <p>bla-bla</p> bla-bla</p>
:后

<p>bla-bla bla-bla bla-bla</p>

这个问题几乎涵盖了您需要知道的所有内容:RegEx匹配打开标记,除了XHTML自包含标记

它的长和短:你不使用正则表达式。你"可以",但它太复杂了,可能会在代码的其他地方产生问题。要么精简代码库,运行html净化器、xml解析器,要么执行其他操作。对于您的问题,Regex可能是错误的解决方案

你可以使用这个模式:

(<(.+)>)(.+?)(<'2>)(.*?)(<'/'2>)(.*?)(<'/'2>)$

和替换字符串为

$1$3$5$7$8

我相信你可以在PHP上做到这一点

   echo preg_replace("(<(.+)>)(.+?)(<''2>)(.*?)(<''/''2>)(.*?)(<''/''2>)$", "$1$3$5$7$8", "<p>bla-bla <p>bla-bla</p> bla-bla</p>");

你可以在这里看到一个正则表达式的实例http://regexr.com/3e8o3

一个重要的注释是,你可能需要在一个while循环中调用这个,直到正则表达式停止匹配,因为这个正则表达式不是递归的,所以这将不适用于3层或更多的嵌套。