1

私は以下のようにテキストでレジストリデータを持っています:

/Classes/CLSID/AppID,SZ,{0010890e-8789-413c-adbc-48f5b511b3af},
/Classes/CLSID/InProcServer32,KEY,,2011-10-14 00:00:33
/Classes/CLSID/InProcServer32/,EXPAND_SZ,%SystemRoot%\x5Csystem32\x5CSHELL32.dll,
/Classes/CLSID/InProcServer32/ThreadingModel,SZ,Apartment,
/Classes/CLSID/,KEY,,2011-10-14 00:00:36
/Classes/CLSID/,SZ,,
/Classes/CLSID/InprocServer32,KEY,,2011-10-14 00:00:36
/Classes/CLSID/InprocServer32/,C:\x5CWINDOWS\x5Csystem32\x5Cmstime.dll,

次に、$ registerry = explode "\ n"を実行し、以下の配列のリストを作成します。

var_dump($registry);

[1]=> string(121) "/Classes/CLSID/AppID,SZ,{0010890e-8789-413c-adbc-48f5b511b3af}," 
[2]=> string(139) "/Classes/CLSID/InProcServer32,KEY,,2011-10-14 00:00:33" 
[3]=> string(89) "/Classes/CLSID/InProcServer32/,EXPAND_SZ,%SystemRoot%\x5Csystem32\x5CSHELL32.dll," 
[4]=> string(103) "/Classes/CLSID/InProcServer32/ThreadingModel,SZ,Apartment," 
[5]=> string(103) "/Classes/CLSID/,KEY,,2011-10-14 00:00:36"
[6]=> string(121) "/Classes/CLSID/,SZ,," 
[7]=> string(139) "/Classes/CLSID/InprocServer32,KEY,,2011-10-14 00:00:36" 
[8]=> string(89) "/Classes/CLSID/InprocServer32/,C:\x5CWINDOWS\x5Csystem32\x5Cmstime.dll," 

配列形式のキーワードもあります

var_dump($keywords);

[1]=> string(12) "Math.dll"
[2]=> string(12) "System.dll"
[3]=> string(12) "inetc.dll"
[4]=> string(12) "time.dll"

$keywordsの文字列で構成される$registryの行を表示したいので、以下に1つの関数を作成します。

    function separate($line) {
      global $keywords;
      foreach ($keywords as $data_filter) {
          if (strpos($line, $data_filter) !== false) {
        return true;
          }
      }
      return false;
    }

$separate = array_filter($registry, 'separate');

$keywordsは"time.dll"で構成されているため、コードは次のような結果を生成します。

var_dump($seperate);

[1]=> string(89) "/Classes/CLSID/InprocServer32/,C:\x5CWINDOWS\x5Csystem32\x5Cmstime.dll," 

私の場合、mstime.dll!= time.dllであり、情報が不適切であるため、結果は正しくありません。

出力は空である必要があります。

「\x5C」をスペースとして置き換えたとしましょう。その仕事をすることができる関数はありますか?前もって感謝します。

4

1 に答える 1

2

preg_matchがあります。

array_filter の方法に沿って進むには、次のことを行う必要があります。

function separate($line) {
    global $keywords;
    foreach ($keywords as $data_filter) {
        // '.' means any character in regex, while '\.' means literal period
        $data_filter = str_replace('.', '\.', $data_filter);
        if (preg_match("/\\x5C{$data_filter}/", $line)) {
            return true;
        }
    }
    return false;
}

これは false を返します

/Classes/CLSID/InprocServer32/,C:\x5CWINDOWS\x5Csystem32\x5Cmstime.dll,

しかし、真実

/Classes/CLSID/InprocServer32/,C:\x5CWINDOWS\x5Csystem32\x5Ctime.dll,

正規表現に慣れていない場合でも、正規表現は素晴らしく強力です。状況に合わせて、必要に応じて鉱山をカスタマイズできます。

于 2012-04-20T17:12:21.963 に答える