【发布时间】:2010-09-12 02:21:03
【问题描述】:
假设我有一个包含一堆文本和 (x)HTML 标记的字符串。我想删除给定标签的所有实例(以及该标签的任何属性),留下所有其他标签和文本。完成这项工作的最佳正则表达式是什么?
编辑添加:哦,我很欣赏使用正则表达式来解决这个特定问题并不是最好的解决方案。但是,为了讨论,我们是否可以假设该特定技术决策比我的薪酬等级高出几个级别? ;)
【问题讨论】:
假设我有一个包含一堆文本和 (x)HTML 标记的字符串。我想删除给定标签的所有实例(以及该标签的任何属性),留下所有其他标签和文本。完成这项工作的最佳正则表达式是什么?
编辑添加:哦,我很欣赏使用正则表达式来解决这个特定问题并不是最好的解决方案。但是,为了讨论,我们是否可以假设该特定技术决策比我的薪酬等级高出几个级别? ;)
【问题讨论】:
虽然使用正则表达式解析 HTML 通常不受欢迎或被看不起,但您几乎肯定不想编写自己的解析器。
但是,您可以使用一些内置或库函数来实现您的需要。
getElementsByTagName 和getElementById,更不用说jQuery。【讨论】:
这是我为此目的编写的一个正则表达式,它适用于更多情况:
</?(?(?=b|img|a|script)notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:(["",']?).*?\1?)?)*\s*/?>
【讨论】:
正确答案:
</?TAG\b[^>]*?>
因为 Dans 的回答会删除 <br />,但您只需要 <b>
【讨论】:
尝试使用正则表达式解析 HTML 通常是一个非常糟糕的主意。改用解析器,应该有一个可用于您选择的语言。
您可能能够摆脱这样的困境:
</?tag[^>]*?>
但这完全取决于你在做什么。例如,这不会删除标签的内容,并且可能会使您的 HTML 处于无效状态,具体取决于您要删除的标签。它还不能很好地处理无效的 HTML(还有很多这样的问题)。
改用解析器:)
【讨论】:
我认为这里发生了一些严重的反正则表达式偏见。很多时候,当使用完整的解析器没有意义时,您可能希望从某些标记中去除特定标签。
当然,有时解析器可能是最佳选择,但如果您正在寻找正则表达式,那么:
<script[^>]*?>[\s\S]*?<\/script>
这将删除脚本标签及其内容。确保使用不区分大小写的匹配。
如果您不想删除标签的内容,那么您可以使用:
<\/?script[^>]*?>
在 javascript 中的使用示例如下:
function stripScripts(markup) {
return markup.replace(/<script[^>]*?>[\s\S]*?<\/script>/gi, '');
}
var safeText = stripScripts(textarea.value);
【讨论】:
在我的脑海中,我想说这会让你朝着正确的方向开始。
s/<TAG[^>]*>([^<]*)</TAG[^>]*>/\1
基本上找到开始标签,标签之间的任何文本,然后是结束标签。用标签之间的内容替换整个内容。
【讨论】:
单个标签的出现方式太多了,更不用说编码、变体等了。
我强烈建议你重新考虑这种方法……无论如何,你真的不应该直接处理 HTML。
【讨论】:
我想可能是 Raymond Chen (blogs.msdn.com/oldnewthing) 我在这里转述(糟糕!)...但是,您想要一个正则表达式? “现在你有两个问题” ... :=)
如果字符串是格式良好的 (X)HTML,您能否将其加载到解析器 (HTML/XML) 中并使用它来删除任何有问题的节点?如果它的格式不正确,那么它会变得有点棘手,但是,我怀疑 RegEx 不是解决这个问题的最佳方法......
【讨论】: