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)
    ] => )

)

为什么它会结束)和新行?我知道这个问题对于理解正则表达式的人来说是微不足道的。因此,我们将不胜感激。

4

1 回答 1

2

描述

您的初始表达式只是找到代表每个键和值集的整个文本块。然后在你的清理部分,你正在寻找一个紧随其后的字符串结尾的关闭参数,\)$但我确信在关闭参数和字符串结尾之间还有其他字符。

相反,我会在一次操作中处理所有这些。该表达式将:

  • 查找字段值
    • 修剪周围的括号
    • 并放入捕获组 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 回答