0

だから、テキストファイルから3文字の単語をキャッチしようとしています。RegEx を作成しましたが、EMPTY 配列が返されます。そして、私はその理由を理解することができません!テキストファイルの一部です。

================================================
Header of File with time and date
================================================
Loaded options from XML file: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/ID2PDF_options.xml
extendedPrintPDF started
Postfix '3.0' was append from file 'ESQ030112ELAM_lo-metadata.xml' for file: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.indd
printPDF started
PDF Export Preset: Some preset
PDF file created: ''/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.pdf'.
File someFileName.xml removed
postprocessingDocument started
INDD file removed: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.indd

私が持っている正規表現は次のとおりです。

/^Loaded options from XML file: '\/.*\/SM_Folder\/([a-zA-Z]{3})\/[a-zA-Z]+_Proof_\1\/processing\/ID2PDF_options.xml$/im

\の前 を削除する\/([a-zA-Z]{3})と、Unknown modifier:(エラーが発生します。

誰かがレコードの最初の行から「ESQ」を取得するために何をする必要があるか教えてもらえますか? 他のレコードでは 3 文字の単語が異なるため、ESQ だけをキャッチするように正規表現を設計することはできません。たとえば、ABC や XYZ などです。しかし、それは3文字の単語のままです。有用な情報をいただければ幸いです。

また、この投稿もあまり役に立ちませんでした: PHP Regex return array with values empty

ノート:

options.xml 

で終わら'ない はずがないから!

4

3 に答える 3

1

質問で提供した正規表現パターンとファイルデータは、空の配列にはなりません。少なくとも私にとってはそうではありません(後で読んでください)。とpreg_match_allちゃんと1本勝負します。私はこのコードを使用しています:

$file = <<<FILE
================================================
Header of File with time and date
================================================
Loaded options from XML file: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/ID2PDF_options.xml
extendedPrintPDF started
Postfix '3.0' was append from file 'ESQ030112ELAM_lo-metadata.xml' for file: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.indd
printPDF started
PDF Export Preset: Some preset
PDF file created: ''/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.pdf'.
File someFileName.xml removed
postprocessingDocument started
INDD file removed: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/someFile.indd
FILE;

$pattern = '/^Loaded options from XML file: \'\/.*\/SM_Folder\/([a-zA-Z]{3})\/[a-zA-Z]+_Proof_\1\/processing\/ID2PDF_options.xml$/im';

$result = preg_match_all($pattern, $file, $matches);

var_dump($result, $matches);

結果:

int(1)
array(2) {
  [0] =>
  array(1) {
    [0] =>
    string(127) "Loaded options from XML file: '/Thisis/some/Users/sumuser/Desktop/SM_Folder/ESQ/Virtual_Proof_ESQ/processing/ID2PDF_options.xml"
  }
  [1] =>
  array(1) {
    [0] =>
    string(3) "ESQ"
  }
}

次のような結果が得られる可能性があります (これも上記とまったく同じコードですが、別のコンピューターでdemo hereを使用しています)。

int(0)
array(2) {
  [0]=>
  array(0) {
  }
  [1]=>
  array(0) {
  }
}

この結果が得られた場合は、複数行モードの^and$が行末と一致しないという兆候です\nが、そこには CRLF シーケンス (DOS/Windows 行末) がない可能性が高いためです。ANYCRLF次のオプションを使用して、これらすべてのシーケンスを取得できます。

$pattern = '/(*ANYCRLF)^Loaded options from XML file: \'\/.*\/SM_Folder\/([a-zA-Z]{3})\/[a-zA-Z]+_Proof_\1\/processing\/ID2PDF_options.xml$/im';
             ^^^^^^^^^^

これで結果が得られるはずです。実際のデモを参照してください。

于 2013-01-04T20:11:49.117 に答える
1
[a-zA-Z]_Proof

する必要があります

[a-zA-Z]+_Proof
于 2013-01-04T17:09:33.237 に答える
0

\/([a-zA-Z]{3})は有効な正規表現ではありません。区切り文字がありません。

preg_match_all(":\/([a-zA-Z]{3}):", $input, $matches);

任意の文字を選択できます。ここでは を選び:ました。

于 2013-01-04T17:09:21.120 に答える