2

PHPと正規表現を使用してFDFファイルを解析しようとしています。しかし、私は正規表現について頭を悩ませることができません。ファイルを解析して配列を生成するのに行き詰まっています。

%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V (email@email.com)
/T (field_email)
>> 
<<
/V (John)
/T (field_name)
>> 
<<
/V ()
/T (field_reference)
>>]
>>
>>
endobj 
trailer

<<
/Root 1 0 R
>>
%%EOF

現在の関数 (ソース: http://php.net/manual/en/ref.fdf.php )

function parse2($file) {
 if (!preg_match_all("/<<\s*\/V([^>]*)>>/x", $file,$out,PREG_SET_ORDER))
         return;
 for ($i=0;$i<count($out);$i++) {
         $pattern = "<<.*/V\s*(.*)\s*/T\s*(.*)\s*>>";
         $thing = $out[$i][1];
         if (eregi($pattern,$out[$i][0],$regs)) {
                 $key = $regs[2];
                 $val = $regs[1];
                 $key = preg_replace("/^\s*\(/","",$key);
                 $key = preg_replace("/\)$/","",$key);
                 $key = preg_replace("/\\\/","",$key);
                 $val = preg_replace("/^\s*\(/","",$val);
                 $val = preg_replace("/\)$/","",$val);
                 $matches[$key] = $val;
         }
 }
 return $matches;
}

結果:

Array
(
    [field_email)
    ] => email@email.com)

    [field_name)
    ] => John)

    [field_reference)
    ] => )

)

)and new 行を終了するのはなぜですか? この問題は、正規表現を理解している人にとっては些細なことです。ですから、助けていただければ幸いです。

4

1 に答える 1

2

説明

最初の式は、各キーと値のセットを表すテキスト ブロック全体を単純に検索します。次に、クリーンアップセクションで、すぐに文字列の末尾が続くクローズパランを探していますが、\)$クローズパランと文字列の末尾の間に追加の文字があると確信しています。

代わりに、これらすべてを 1 回の操作で処理します。この式は次のようになります。

  • フィールド値を見つける
    • 周囲のかっこを切り取る
    • キャプチャグループ1に配置します
  • 値の名前を見つけて、キャプチャ グループ 2 に配置します。
    • field_部分文字列を切り取る
    • 周囲のかっこを切り取る
    • キャプチャグループ2に配置します
  • オプションが必要です: 大文字と小文字を区別しない、および複数行

^\/V\s\(([^)]*)\)[\r\n]*^\/T\s\(field_([^)]*)\)

ここに画像の説明を入力

ライブデモ

サンプルテキスト

%FDF-1.2
%âãÏÓ
1 0 obj 
<<
/FDF 
<<
/Fields [
<<
/V (email@email.com)
/T (field_email)
>> 
<<
/V (John)
/T (field_name)
>> 
<<
/V ()
/T (field_reference)
>>]
>>
>>
endobj 
trailer

<<
/Root 1 0 R
>>
%%EOF

マッチ

[0][0] = /V (email@email.com)
/T (field_email)
[0][1] = email@email.com
[0][2] = email

[1][0] = /V (John)
/T (field_name)
[1][1] = John
[1][2] = name

[2][0] = /V ()
/T (field_reference)
[2][1] = 
[2][2] = reference



または

部分文字列を保持したい場合はfield_、次のように式から単純に削除できます。

^\/V\s\(([^)]*)\)[\r\n]*^\/T\s\(([^)]*)\)

ここに画像の説明を入力

于 2013-08-10T14:23:17.507 に答える