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

时间:2016-09-19 12:54:44

标签: php regex

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

如果标记包含在同一标记

中,则标记错误

例如,这一行

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

2 个答案:

答案 0 :(得分:0)

这个问题几乎涵盖了您需要了解的所有内容:RegEx match open tags except XHTML self-contained tags

它的长短:你不能使用正则表达式。你&#34;可能&#34;但它会如此复杂以至于会在代码中的其他地方产生问题。修剪你的代码库,运行html净化器,xml解析器或其他类似的东西。正则表达式可能是您的问题的错误解决方案。

答案 1 :(得分:0)

你可以使用这种模式:

(<(.+)>)(.+?)(<\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个或更多级别的嵌套。