除链接外,删除所有HTML标签

27

我正在尝试编写一个正则表达式来去除所有 HTML 标签,但要保留链接标签(即分别为 <a href</a> 的标签)。它不必是 100% 安全的(因为我正在解析已经获得批准和发布到 SWF 影片中的内容)。

我使用的原始“去除标签”正则表达式是 <(.|\n)+?>,我试图修改它为 <([^a]|\n)+?>,但这当然会允许任何具有a字母的标签而不仅仅是开头带空格的链接标签。

虽然这并不重要,但如果有人关心的话,我是用ActionScript 3.0编写这段代码,用于一个Flash影片。

6个回答

28
<(?!\/?a(?=>|\s.*>))\/?.*?>

试试这个。对于p标签有类似的东西。它们可以工作,所以不知道为什么不能使用。使用负向先行断言来检查它是否匹配一个(带有可选/字符前缀的)a,其中(使用正向先行断言)a(带有可选/前缀)后跟一个> 或 空格,然后是一些内容,最后是 >。然后它匹配直到下一个 > 字符。将其放入subst中,然后加上

s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;

这应该只保留开放和关闭a标签


1

一般来说,这种方法存在问题。正则表达式最适合进行“平面”文本匹配,而嵌套数据则会将正则表达式引擎推入其设计之外的领域。一般的HTML解析需要使用解析器而非正则表达式引擎(如果您想了解完整的技术细节,请搜索正则语言和上下文无关语言之间的区别)。

可以通过将“<”和“>”替换为空字符串或它们的实体等效项来轻松剥离所有标记,但是使用正则表达式对HTML进行选择性过滤将容易受到各种偶然或恶意输入破坏的影响。


0

给你:

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

0

我一直在强调它,但我无法过多地推荐regexr。它非常适合测试这种类型的内容。


-1

怎么样?

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

?


这会保留<a>但是移除</a>。 - Christophe De Troyer

-2

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 解决方案。 - shaedrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接