关于正则表达式:除链接外的所有HTML标签

关于正则表达式:除链接外的所有HTML标签

Strip all HTML tags except links

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

我使用的原始" strip标签"正则表达式是<(.|\ )+?>,并且我尝试将其修改为<([^a]|\ )+?>,但是当然可以允许其中包含a的任何标签,而不是其中包含a的标签。 开始,有一个空格。

并不是说它真的很重要,但是万一有人想知道我是在ActionScript 3.0中为Flash电影编写的。


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

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

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

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


通常,这种方法存在问题。正则表达式最适合"平面"文本匹配-嵌套数据将正则表达式引擎推入其未设计的区域。常规HTML解析需要解析器而不是正则表达式引擎(如果您需要完整的技术细节,请使用Google了解常规语言和上下文无关语言之间的区别)。

通过用空字符串或它们的实体等效项替换/ /来剥离所有标记很容易,但是使用正则表达式选择性地筛选HTML将很容易受到各种意外或恶意输入的破坏。


我一直在继续,但是我无法经常推荐regexr。测试这种类型的东西真是太棒了。


干得好:

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

怎么样

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


strip_tags()执行此操作。

在这里,我包括所有

标记并输出整理的版本:

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


推荐阅读