从字符串中删除给定(x)HTML标记的正则表达式
假设我有一个字符串,其中包含一堆乱七八糟的文本和(x)HTML标签。我想删除给定标签的所有实例(以及该标签的所有属性),同时保留所有其他标签和文本。完成此任务的最佳正则表达式是什么?
编辑添加:哦,我感谢使用Regex解决此特定问题不是最佳解决方案。但是,出于讨论的目的,我们可以假设该特定技术决策是在我的薪资等级上做出几个级别的决定吗? ;)
解决方案
尝试使用正则表达式解析HTML通常是一个非常糟糕的主意。请改用解析器,选择的语言应为一种。
我们也许可以摆脱类似这样的情况:
</?tag[^>]*?>
但这完全取决于我们在做什么。例如,这不会删除标签的内容,并且可能会导致HTML处于无效状态,具体取决于我们要删除的标签。它还严重地应对了无效的HTML(并且有很多有关的内容)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
改用解析器:)
我想可能是我在这里释义(很糟糕!)是Raymond Chen(blogs.msdn.com/oldnewthing)...但是,我们想要一个正则表达式吗? "现在我们有两个问题" ...:=)
如果字符串格式正确(X)HTML,我们是否可以将其加载到解析器(HTML / XML)中,并使用它来删除任何有害的节点?如果格式不正确,那么它将变得有些棘手,但是,我怀疑RegEx不是解决此问题的最佳方法...
单个标签可以有太多的显示方式,更不用说编码,变体等了。
我强烈建议我们重新考虑这种方法...。无论如何,我们真的不应该直接处理HTML。
我想说的是,这将使我们朝正确的方向开始。
s/<TAG[^>]*>([^<]*)</TAG[^>]*>/
基本上找到开始标签,标签之间的所有文本,然后是结束标签。将整个内容替换为标签之间的内容。
我认为这里发生了一些严重的反正则表达式偏见。很多时候,当我们不希望使用完整的解析器时,可能希望将某些标记从某些标记中剥离出来。
当然,有时候解析器可能是最好的选择,但是如果我们正在寻找正则表达式,则:
<script[^>]*?>[\s\S]*?<\/script>
那将删除脚本标签及其内容。确保使用不区分大小写的匹配。
如果我们不想删除标签的内容,则可以使用:
<\/?script[^>]*?>
在javascript中使用的示例是:
function stripScripts(markup) { return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, ''); } var safeText = stripScripts(textarea.value);
更正的答案:
</?TAG\b[^>]*?>
因为Dans的答案会删除<br />
,但是我们只需要<b>
这是我为此编写的一个正则表达式,它可以在更多情况下使用:
</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*??)?)*\s*/?>
虽然通常不赞成使用正则表达式来解析HTML,但是我们几乎可以肯定不想编写自己的解析器。
但是,我们可以使用一些内置函数或者库函数来实现所需的功能。
- JavaScript具有
getElementsByTagName
和getElementById
,更不用说jQuery了。 - PHP具有DOM扩展名。
- Python有很棒的美丽汤
- ...还有很多。