ホームページ > バックエンド開発 > PHPチュートリアル > [QMacros] チュートリアル: QMacros を使用して、PHP スクリプトから使用されている変数名のリストを取得する

[QMacros] チュートリアル: QMacros を使用して、PHP スクリプトから使用されている変数名のリストを取得する

WBOY
リリース: 2016-06-23 13:14:14
オリジナル
850 人が閲覧しました

【注意】このチュートリアルはデモンストレーションのみを目的としており、作者が特定の実践を推奨または反対することを意味するものではなく、また、これらのコードが他の実用的な用途を持つことを意味するものではありません。

QMacros は、豊富な機能を提供する効率的なスタック検索および置換エンジンです。次のコードは、PHP+HTML 混合コードの一部からすべての PHP 定義変数名を取得する方法を示しています (ソース コードは Memo1 に配置され、出力変数名は Memo2 に直接配置されます)。

type  TForm1 = class(TForm)    Button1: TButton;    Memo1: TMemo;    Memo2: TMemo;    procedure Button1Click(Sender: TObject);  private    { Private declarations }    procedure DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW;      const AQuoter: QCharW; var AHandled: Boolean);    procedure DoVarNameFound(ASender: TQMacroManager; AName: QStringW;      const AQuoter: QCharW; var AHandled: Boolean);  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var  AMacros: TQMacroManager;  AResult: TQMacroComplied;begin  AMacros := TQMacroManager.Create;  try    AList.Duplicates := dupIgnore;    AMacros.OnMacroMissed := DoCodeBlockFound;    //Complie is enough    AResult := AMacros.Complie(Memo1.Text, '<?php', '?>');    if Assigned(AResult) then //We don't use the result for replace,so free it.      FreeAndNil(AResult);  finally    AMacros.Free;  end;end;procedure TForm1.DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW;  const AQuoter: QCharW; var AHandled: Boolean);var  AVarParser: TQMacroManager;  AReplace: TQMacroComplied;begin  AVarParser := TQMacroManager.Create;  try    AVarParser.OnMacroMissed := DoVarNameFound;    AReplace := AVarParser.Complie(AName, '$', '', MRF_END_WITH_INVALID_CHAR);    if AReplace <> nil then    begin      ASender.Push(AName, '');      AHandled := True;      FreeAndNil(AReplace);    end;  finally    FreeAndNil(AVarParser);  end;end;procedure TForm1.DoVarNameFound(ASender: TQMacroManager; AName: QStringW;  const AQuoter: QCharW; var AHandled: Boolean);begin  Memo2.Lines.Add(AName);  ASender.Push(AName, '');  AHandled := True;end;
ログイン後にコピー
type  TForm1 = class(TForm)    Button1: TButton;    Memo1: TMemo;    Memo2: TMemo;    procedure Button1Click(Sender: TObject);  private    { Private declarations }    procedure DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW;      const AQuoter: QCharW; var AHandled: Boolean);    procedure DoVarNameFound(ASender: TQMacroManager; AName: QStringW;      const AQuoter: QCharW; var AHandled: Boolean);  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);var  AMacros: TQMacroManager;  AResult: TQMacroComplied;begin  AMacros := TQMacroManager.Create;  try    AList.Duplicates := dupIgnore;    AMacros.OnMacroMissed := DoCodeBlockFound;    //Complie is enough    AResult := AMacros.Complie(Memo1.Text, '<?php', '?>');    if Assigned(AResult) then //We don't use the result for replace,so free it.      FreeAndNil(AResult);  finally    AMacros.Free;  end;end; procedure TForm1.DoCodeBlockFound(ASender: TQMacroManager; AName: QStringW;  const AQuoter: QCharW; var AHandled: Boolean);var  AVarParser: TQMacroManager;  AReplace: TQMacroComplied;begin  AVarParser := TQMacroManager.Create;  try    AVarParser.OnMacroMissed := DoVarNameFound;    AReplace := AVarParser.Complie(AName, '$', '', MRF_END_WITH_INVALID_CHAR);    if AReplace <> nil then    begin      ASender.Push(AName, '');      AHandled := True;      FreeAndNil(AReplace);    end;  finally    FreeAndNil(AVarParser);  end;end; procedure TForm1.DoVarNameFound(ASender: TQMacroManager; AName: QStringW;  const AQuoter: QCharW; var AHandled: Boolean);begin  Memo2.Lines.Add(AName);  ASender.Push(AName, '');  AHandled := True;end;
ログイン後にコピー

誰もが比較できるようにインターフェースを投稿します:

OK、Button1 の OnClick イベントの応答関数 Button1Click でこれを実行しました:

TMacroManager オブジェクトのインスタンス AMacros を作成し、次に、 OnMacroMissed イベントの応答関数を DoCodeBlockFound 関数に指定します。この関数は、 で終わるコード ブロックを見つけるために使用されます。 DoCodeBlockFound 関数はさらに次の処理を実行します。

TQMacroManager オブジェクトのインスタンスを作成し、その OnMacroMissed イベント応答関数を DoVarNameFound を指すように設定します。 DoVarNameFoundでは、見つかった変数名をMemo2に出力します。
    • AMacros の Complie メソッドを呼び出し、ソース コードを解析し、PHP コード ブロックを見つけます。コード ブロックのマクロ定義をプッシュしないため、OnMacroMissed イベントの応答関数 DoCodeBlockFound がトリガーされます。さらなる処理をトリガーし、入力タスクの名前を完了します。
  • OnMacroMissed イベントの処理では、QMacros の背後にあるデフォルトの処理コードを回避するために、AName という名前のパラメーターをスタックにプッシュし、AHandled を True に設定していることに注意してください。
  • さて、コードの簡単な解釈は以上です。実際には非常に明確です。ここで効果を見てみましょう:

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート