代码之家  ›  专栏  ›  技术社区  ›  Abs

通过regex删除块注释

  •  7
  • Abs  · 技术社区  · 15 年前

    我很难让这个regex工作。我只想删除块注释。这是我目前为止的成绩,但我无法摆脱决赛 */ .

    $string = 'this is a test /*asdfa  */ ok then';
    
    $pattern = '/\/\*([^\*\/]*)/i';
    
    $replacement = '';
    
    echo preg_replace($pattern, $replacement, $string);
    
    //this is a test */ ok then
    

    任何帮助都将不胜感激。

    7 回复  |  直到 15 年前
        1
  •  6
  •   Billy ONeal IS4    15 年前

    使用不同于的分隔符 / --这让人困惑。

    怎么样 '#/\*.+?\*/#s' ;

        2
  •  6
  •   Alin P.    15 年前

    token_get_all 在没有 T_COMMENT 我觉得没什么好说的了。

        3
  •  5
  •   Billy ONeal IS4    15 年前

    尝试以下模式:

    /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/

        4
  •  1
  •   mario    15 年前

    我用这个(注意你只需要第一行 /*...*/ 评论):

      #-- extract /* ... */ comment block
      #  or lines of #... #... and //... //...
      if (preg_match("_^\s*/\*+(.+?)\*+/_s", $src, $uu)
      or (preg_match("_^\s*((^\s*(#+|//+)\s*.+?$\n)+)_ms", $src, $uu))) {
         $src = $uu[1];
      }
      // Public Domain, not CC
    

    效果相当好。但是像所有的regex解决方案一样,它在 $PHP = "st/*rings" 边缘情况。

        5
  •  0
  •   Daniel F. Thornton    15 年前

    运行 preg_replace 两次带图案 /\*|\*/ 应该工作。

        6
  •  0
  •   Billy ONeal IS4    15 年前

    为了修复您的主模式,我可以告诉您,您不匹配最后的“*/”,因为您的模式中缺少它。

    按照您自己的模式,尝试以下小修改:

    '/\/\*([^\*\/]*)**\*\/**/i'

    我还建议您使用不同的分隔符来使模式更易于阅读。

    #/\*([^\*/]*)\*/#i

        7
  •  0
  •   Alan Moore Chris Ballance    15 年前

    也许吧:

    $pattern = '/\/\*([.]*)\*\//i';
    

    请不要降低费率,因为这是一个快速的猜测,试图帮助…:)

    推荐文章