0

PHPスクリプトに含まれるファイルのすべての出現のリストを取得しようとしています。

これを含むファイル全体を読んでいます:

<?php
    echo 'Hello there';

    include 'some_functions.php';

    echo 'Trying to find some includes.';

    include 'include_me.php';

    echo 'Testtest.';
?>

次に、そのファイルに対して次のコードを実行します。

if (preg_match_all ("/(include.*?;){1}/is", $this->file_contents, $matches))
  {
      print_r($matches);
  }

この一致を実行すると、期待される結果が得られます...これは 2 つのインクルード セクションですが、まったく同じことの繰り返し、またはインクルード ステートメントのランダムなチャンクも得られます。出力の例を次に示します。

    Array ( 
[0] => Array ( [0] => include 'some_functions.php'; [1] => include 'include_me.php'; ) 
[1] => Array ( [0] => include 'some_functions.php'; [1] => include 'include_me.php'; ) ) 

ご覧のとおり、同じ結果が複数回ネストされた配列になっています。include ステートメントごとに配列内に 1 つの項目が必要であり、繰り返しやネストされた配列は必要ありません。

これらの正規表現に問題があるため、いくつかのガイダンスが必要です。お時間をいただきありがとうございます。

4

3 に答える 3

3

を使用するか、スクリプトが含まれていない場合はget_included_files()組み込みのトークナイザーを使用します

現在のファイルではなく、別のファイルの内容の文字列を検索しています

次に、最善の策はトークナイザーです。これを試して:

$scriptPath = '/full/path/to/your/script.php';
$tokens = token_get_all(file_get_contents($scriptPath));
$matches = array();
$incMode = null;

foreach($tokens as $token){

  // ";" should end include stm.
  if($incMode && ($token === ';')){
    $matches[] = $incMode;
    $incMode = array();
  }

  // keep track of the code if inside include statement
  if($incMode){
    $incMode[1] .= is_array($token) ? $token[1] : $token;
    continue;
  }  

  if(!is_array($token))
    continue;

  // start of include stm.
  if(in_array($token[0], array(T_INCLUDE, T_INCLUDE_ONCE, T_REQUIRE, T_REQUIRE_ONCE)))
    $incMode = array(token_name($token[0]), '');
}

print_r($matches); // array(token name, code)
于 2013-06-23T22:00:34.547 に答える
1

preg_match_allの仕組みを読んでください

配列の最初の項目 - 正規表現のすべてのテキストを返します。配列内の次の項目 - 正規表現 (括弧内) からのテキストです。

$matches[1] を使用する必要があります

于 2013-06-23T22:02:29.420 に答える