27

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

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

并不是说它真的很重要,但如果有人想知道我正在用ActionScript 3.0Flash电影编写这个。

4

6 回答 6

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

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

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

这应该只留下打开和关闭标签

于 2008-09-04T16:29:23.193 回答
1

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

于 2008-09-05T12:41:37.257 回答
1

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

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

于 2008-09-22T11:36:53.547 回答
0

干得好:

{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
于 2009-12-28T08:06:21.733 回答
-1

怎么样

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

?

于 2008-09-04T16:09:10.030 回答
-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
于 2014-05-13T20:02:30.687 回答