去除除链接之外的所有 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()
会这样做。
在这里,我包含了所有<a><p><font><b><i><sup>
标签并输出了一个整理后的版本:
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 标签的主要内容,如果未能解决你的问题,请参考以下文章