web-dev-qa-db-ja.com

コメントと複数行コメントおよび空行を削除する正規表現

ファイルを解析し、phpと正規表現を使用して削除したい:

  • 空白行または空行
  • 一行コメント
  • 複数行コメント

基本的に私は含む行を削除したい

/* text */ 

または複数行コメント

/***
some
text
*****/

可能であれば、行が空かどうかを確認するための別の正規表現(空白行を削除)

それは可能ですか?誰かが私にそれを行う正規表現を投稿できますか?

どうもありがとう。

22
Ahmad Fouad
$text = preg_replace('!/\*.*?\*/!s', '', $text);
$text = preg_replace('/\n\s*\n/', "\n", $text);
46
chaos

解析しているファイルにこれらの条件に一致するものを含む文字列が含まれている場合、使用する正規表現は失敗することに注意してください。たとえば、次のようになります。

print "/* a comment */";

これに:

print "";

これはおそらくnotあなたが望むものです。でも多分そうかもしれませんが、わかりません。とにかく、正規表現は技術的にその問題を回避する方法でデータを解析することはできません。技術的に言うと、現代のPCRE正規表現は、これを実行できるようにするために多くのハックに取り組んでおり、さらに重要なことに、もはやregular式ではありません。引用符内やその他の状況でこれらのものを削除することを避けたい場合は、本格的なパーサーに代わるものはありません(それでもかなり単純な場合があります)。

11
Chris Lutz
//  Removes multi-line comments and does not create
//  a blank line, also treats white spaces/tabs 
$text = preg_replace('!^[ \t]*/\*.*?\*/[ \t]*[\r\n]!s', '', $text);

//  Removes single line '//' comments, treats blank characters
$text = preg_replace('![ \t]*//.*[ \t]*[\r\n]!', '', $text);

//  Strip blank lines
$text = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $text);
5
makaveli_lcf
$string = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $string);
2

それは可能ですが、私はそれをしません。必要な空白(文字列、キーワード/識別子の間の空白(publicfuntiondoStuff())など)が削除されていないことを確認するために、phpファイル全体を解析する必要があります。 PHPの トークン化拡張 を使用することをお勧めします。

2
soulmerge

これは、すべての/ *を* /に置き換えるときに機能するはずです。

$string = preg_replace('/(\s+)\/\*([^\/]*)\*\/(\s+)/s', "\n", $string);
2

これは良い機能であり、機能します!

<?
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}
function strip_comments($source) {
    $tokens = token_get_all($source);
    $ret = "";
    foreach ($tokens as $token) {
       if (is_string($token)) {
          $ret.= $token;
       } else {
          list($id, $text) = $token;

          switch ($id) { 
             case T_COMMENT: 
             case T_ML_COMMENT: // we've defined this
             case T_DOC_COMMENT: // and this
                break;

             default:
                $ret.= $text;
                break;
          }
       }
    }    
    return trim(str_replace(array('<?','?>'),array('',''),$ret));
}
?>

ここで、この関数 'strip_comments'を使用して、変数に含まれるコードを渡します。

<?
$code = "
<?php 
    /* this is comment */
   // this is also a comment
   # me too, am also comment
   echo "And I am some code...";
?>";

$code = strip_comments($code);

echo htmlspecialchars($code);
?>

結果は次のようになります

<?
echo "And I am some code...";
?>

Phpファイルからの読み込み:

<?
$code = file_get_contents("some_code_file.php");
$code = strip_comments($code);

echo htmlspecialchars($code);
?>

PHPファイルをロードし、コメントを削除して保存し直します

<?
$file = "some_code_file.php"
$code = file_get_contents($file);
$code = strip_comments($code);

$f = fopen($file,"w");
fwrite($f,$code);
fclose($f);
?>

ソース: http://www.php.net/manual/en/tokenizer.examples.php

0
Eduardo Cuomo

これが自分に合っていると思いました、(\s+)\/\*([^\/]*)\*/\n*複数行、タブ付き、またはコメントなし、およびその後ろのスペースを削除します。この正規表現が一致するコメントの例を残します。

/**
 * The AdditionalCategory
 * Meta informations extracted from the WSDL
 * - minOccurs : 0
 * - nillable : true
 * @var TestStructAdditionalCategorizationExternalIntegrationCUDListDataContract
 */
0
Rogerio Dalot

正規表現に慣れていない場合、これが私の解決策です。次のコードは、#で区切られたすべてのコメントを削除し、このスタイルの変数の値を取得しますNAME = VALUE

  $reg = array();
  $handle = @fopen("/etc/chilli/config", "r");
  if ($handle) {
   while (($buffer = fgets($handle, 4096)) !== false) {
    $start = strpos($buffer,"#") ;
    $end   = strpos($buffer,"\n");
     // echo $start.",".$end;
       // echo $buffer ."<br>";



     if ($start !== false)

        $res = substr($buffer,0,$start);
    else
        $res = $buffer; 
        $a = explode("=",$res);

        if (count($a)>0)
        {
            if (count($a) == 1 && !empty($a[0]) && trim($a[0])!="")
                $reg[ $a[0] ] = "";
            else
            {
                if (!empty($a[0]) && trim($a[0])!="")
                    $reg[ $a[0] ] = $a[1];
            }
        }




    }

    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}
0
giuseppe