假设我有一个字符串,其中包含大量文本和(x)HTML标记。我想删除给定标记的所有实例(以及该标记的任何属性),保留所有其他标记和文本。完成这项任务的最佳正则表达方式是什么?
编辑补充:哦,我感谢使用正则表达式来解决这个问题不是最好的解决方案。但是,为了便于讨论,我们可以假设这个特定的技术决策比我的工资等级高出一些水平吗? ;)
答案 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通常不受欢迎或被忽视,但您几乎肯定不想编写自己的解析器。
然而,您可以使用一些内置或库函数来实现您的需求。
getElementsByTagName
和getElementById
,更不用说jQuery了。