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