去除除链接之外的所有 HTML 标签

Posted

技术标签:

【中文标题】去除除链接之外的所有 HTML 标签【英文标题】:Strip all HTML tags except links 【发布时间】:2010-09-07 19:53:26 【问题描述】:

我正在尝试编写一个正则表达式来去除除链接之外的所有 html(分别为 <a href</a> 标记。它不一定是 100% 安全的(我不担心注入攻击或我正在解析已被批准并发布到SWF 电影中的任何内容)。

我使用的原始“条形标签”正则表达式是<(.|\n)+?>,我尝试将其修改为<([^a]|\n)+?>,但这当然允许任何具有a的标签在它里面,而不是一开始就有它,有一个空格。

这并不重要,但如果有人想知道我在ActionScript 3.0 写这个Flash 电影。

【问题讨论】:

【参考方案1】:

怎么样

<[^a](.|\n)+?>

?

【讨论】:

这会保留 但会删除 【参考方案2】:
<(?!\/?a(?=>|\s.*>))\/?.*?>

试试这个。 p 标签有类似的东西。为他们工作所以不明白为什么不。使用负前瞻来检查它是否不匹配 a(以可选 / 字符为前缀),其中(使用正前瞻)a(带有可选 / 前缀)后跟 > 或空格、填充物然后 >。然后匹配到下一个 > 字符。用

把它放在一个 subst 中
s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;

这应该只留下开始和结束的标签

【讨论】:

【参考方案3】:

我一直在谈论它,但我无法经常推荐regexr。测试这类东西真是太棒了。

【讨论】:

【参考方案4】:

一般来说,这种方法存在问题。正则表达式最适合“平面”文本匹配 - 嵌套数据将正则表达式引擎推入非设计区域。一般的 HTML 解析需要一个解析器而不是一个正则表达式引擎(如果您想要完整的技术细节,请谷歌了解常规语言和无上下文语言之间的区别)。

通过将 / 和 />/ 替换为空字符串或其实体等效项很容易去除所有标签,但使用正则表达式选择性地过滤 HTML 将容易受到各种意外或恶意输入破坏的影响。

【讨论】:

【参考方案5】:

给你:

<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>

【讨论】:

【参考方案6】:

strip_tags() 会这样做。

在这里,我包含了所有&lt;a&gt;&lt;p&gt;&lt;font&gt;&lt;b&gt;&lt;i&gt;&lt;sup&gt; 标签并输出了一个整理后的版本:

cat input.htm | tr -d '\n' | php -r '$input=fgets(STDIN); echo strip_tags($input,"<a><p><font><b><i><sup>");' | tidy -i -wrap 0 -o output.htm

【讨论】:

感谢您的回答,但 strip_tags() 是一个 php 函数,问题所有者要求提供一个 actionscript 解决方案。

以上是关于去除除链接之外的所有 HTML 标签的主要内容,如果未能解决你的问题,请参考以下文章

去除所有 HTML 标签,允许的除外

jsoup - 去除所有格式和链接标签,只保留文本

如何使用角度链接功能禁用除特定元素之外的所有点击

如何在记事本++中删除除html标签和此HTML标签内容之外的所有内容?

正则表达式去除除科学记数法之外的所有非数字字符

为啥我会收到此错误?返回标签错误(页面没有链接回来)