代码之家  ›  专栏  ›  技术社区  ›  Jeff Winkworth

除去链接以外的所有HTML标记

  •  27
  • Jeff Winkworth  · 技术社区  · 18 年前

    我正试图编写一个正则表达式来剥离除链接( <a href </a> SWF 电影)。

    我使用的原始“strip tags”正则表达式是 <(.|\n)+?> <([^a]|\n)+?> ,但这当然会允许任何具有 在它里面,而不是一开始就有它,有一个空间。

    这并不重要,但万一有人想知道我在写这篇文章 ActionScript 3.0 暂时 Flash 电影

    6 回复  |  直到 16 年前
        1
  •  27
  •   Xetius    18 年前
    <(?!\/?a(?=>|\s.*>))\/?.*?>
    

    试试这个。有一些类似的p标签。为他们工作,所以我不明白为什么不。使用负先行检查是否与a(前缀为可选/字符)不匹配,其中(使用正先行检查)a(前缀为可选/字符)后跟a>或者一个空间,然后>。然后匹配到下一个>性格把这个放在一个有

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

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

        2
  •  1
  •   grapefrukt    18 年前

    我一直在说,但我没办法推荐 regexr

        3
  •  1
  •   domgblackwell    17 年前

    一般来说,这种方法存在问题。正则表达式最适合于“平面”文本匹配-嵌套数据将正则表达式引擎推送到它们未设计的区域。一般的HTML解析需要一个解析器,而不是正则表达式引擎(如果需要完整的技术细节,可以通过谷歌搜索常规语言和上下文无关语言之间的差异)。

    通过替换/</和/>/使用空字符串或其实体等价物,但使用正则表达式选择性地过滤HTML,将容易受到各种意外或恶意输入的攻击。

        4
  •  0
  •   sth    16 年前

    干得好:

    {<(?!i|b|h[1-6]|/i|/b|/h[1-6][\s|>|/])[^>]*>}
    
        5
  •  -1
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    怎么样

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

    ?

        6
  •  -2
  •   Geremia    12 年前

    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