我正在尝试编写一个正则表达式来去除除链接之外的所有 HTML(分别是<a href
和</a>
标签。它不必是 100% 安全的(我不担心注入攻击或任何事情,因为我正在解析已经被批准并发布到SWF电影中)。
我使用的原始“条形标签”正则表达式是<(.|\n)+?>
,我尝试将其修改为<([^a]|\n)+?>
,但这当然将允许任何带有a的标签,而不是开头带有空格的标签。
并不是说它真的很重要,但如果有人想知道我正在用ActionScript 3.0为Flash电影编写这个。
我正在尝试编写一个正则表达式来去除除链接之外的所有 HTML(分别是<a href
和</a>
标签。它不必是 100% 安全的(我不担心注入攻击或任何事情,因为我正在解析已经被批准并发布到SWF电影中)。
我使用的原始“条形标签”正则表达式是<(.|\n)+?>
,我尝试将其修改为<([^a]|\n)+?>
,但这当然将允许任何带有a的标签,而不是开头带有空格的标签。
并不是说它真的很重要,但如果有人想知道我正在用ActionScript 3.0为Flash电影编写这个。
<(?!\/?a(?=>|\s.*>))\/?.*?>
试试这个。p 标签有类似的东西。为他们工作所以不明白为什么不。使用负前瞻来检查它是否不匹配 a(以可选 / 字符为前缀),其中(使用正前瞻)a(带有可选 / 前缀)后跟 > 或空格、填充物然后 >。然后匹配到下一个 > 字符。把它放在一个替代品中
s/<(?!\/?a(?=>|\s.*>))\/?.*?>//g;
这应该只留下打开和关闭标签
我一直在谈论它,但我无法经常推荐regexr。测试这种类型的东西真是太棒了。
一般来说,这种方法存在问题。正则表达式最适合“平面”文本匹配 - 嵌套数据将正则表达式引擎推入非设计区域。一般的 HTML 解析需要一个解析器而不是一个正则表达式引擎(如果您想要完整的技术细节,请谷歌了解常规语言和无上下文语言之间的区别)。
通过将 /</ 和 />/ 替换为空字符串或其实体等效项很容易去除所有标签,但使用正则表达式选择性地过滤 HTML 将容易受到各种意外或恶意输入的破坏。
干得好:
{<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
怎么样
<[^a](.|\n)+?>
?
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