用于从字符串中删除给定(x)HTML标记的正则表达式

时间:2008-09-22 17:56:48

标签: html regex string

假设我有一个字符串,其中包含大量文本和(x)HTML标记。我想删除给定标记的所有实例(以及该标记的任何属性),保留所有其他标记和文本。完成这项任务的最佳正则表达方式是什么?

编辑补充:哦,我感谢使用正则表达式来解决这个问题不是最好的解决方案。但是,为了便于讨论,我们可以假设这个特定的技术决策比我的工资等级高出一些水平吗? ;)

8 个答案:

答案 0 :(得分:17)

尝试使用正则表达式解析HTML通常是非常坏主意。使用解析器,应该有一个可用于您选择的语言。

可能能够逃脱这样的事情:

</?tag[^>]*?>

但这完全取决于你正在做什么。例如,这不会删除标记的内容,并且可能会使HTML处于无效状态,具体取决于您尝试删除的标记。它也可以很好地处理无效的HTML(并且有很多相关的内容)。

改为使用解析器:)

答案 1 :(得分:15)

我认为这里发生了一些严重的反正则表达偏见。很多时候,如果使用完整的解析器没有意义,可能需要从某个标记中删除特定标记。

当然有时解析器可能是最好的选择,但是如果你正在寻找正则表达式那么:

<script[^>]*?>[\s\S]*?<\/script>

这将删除脚本标记及其内容。确保使用不区分大小写的匹配。

如果您不想删除标签的内容,可以使用:

<\/?script[^>]*?>

javascript中使用的一个例子是:

function stripScripts(markup) {
  return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');
}

var safeText = stripScripts(textarea.value);

答案 2 :(得分:0)

我认为可能是Raymond Chen(blogs.msdn.com/oldnewthing),我在这里解释(严重!)......但是,你想要一个正则表达式? “现在你有两个问题”......:=)

如果字符串格式正确(X)HTML,您可以将其加载到解析器(HTML / XML)中并使用它来删除任何有问题的节点吗?如果它不是很好,那么它会变得有点棘手,但是,我怀疑RegEx不是最好的方法......

答案 3 :(得分:0)

单个标签可以出现多种方式,更不用说编码,变体等 我强烈建议你重新考虑这种方法......无论如何,你真的不应该直接处理HTML。

答案 4 :(得分:0)

离开我的头顶,我会说这会让你开始朝着正确的方向前进。

s/<TAG[^>]*>([^<]*)</TAG[^>]*>/\1

基本上找到起始标记,标记之间的任何文本,然后是结束标记。用标签之间的任何东西替换整个东西。

答案 5 :(得分:0)

更正回答:

</?TAG\b[^>]*?>

因为Dans的回答会删除<br />,但您只想要<b>

答案 6 :(得分:0)

这是我为此目的编写的正则表达式,它可以在更多情况下工作:

</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>

答案 7 :(得分:0)

虽然使用正则表达式来解析HTML通常不受欢迎或被忽视,但您几乎肯定不想编写自己的解析器。

然而,您可以使用一些内置或库函数来实现您的需求。

  • JavaScript有getElementsByTagNamegetElementById,更不用说jQuery了。
  • PHP具有DOM扩展名。
  • Python有很棒的Beautiful Soup
  • ......还有更多。