用于提取FDF数据的PHP正则表达式代码

用于提取FDF数据的PHP正则表达式代码,php,regex,fdf,Php,Regex,Fdf,我正在尝试使用PHP和正则表达式解析FDF文件。但我就是不能在regex周围动脑。我一直在解析文件以生成数组 %FDF-1.2 %âãÏÓ 1 0 obj << /FDF << /Fields [ << /V (email@email.com) /T (field_email) >> << /V (John) /T (field_name) >> << /V () /T (field_reference)

我正在尝试使用PHP和正则表达式解析FDF文件。但我就是不能在regex周围动脑。我一直在解析文件以生成数组

%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
为什么它会把
和新行归纳起来?我知道对于理解正则表达式的人来说,这个问题并不重要。因此,非常感谢您的帮助。

说明 初始表达式只查找表示每个键和值集的整个文本块。然后在“清理”部分中,您正在查找紧跟字符串末尾的close paran,但我确信close paran和字符串末尾之间还有其他字符

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

  • 查找字段值
    • 修剪周围的帕伦
    • 然后进入捕获组1
  • 找到值的名称并放入捕获组2中
    • 修剪
      字段
      子字符串
    • 修剪周围的帕伦
    • 然后进入捕获组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


或 如果希望保留
字段
子字符串,则可以简单地从表达式中删除它,如下所示:

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


添加\ims标志,正则表达式在php中可以完美地工作(preg_match_all(“/^\/V\s([^)]*)[\r\n]*/T\s(field_([^)]*)/ims“,$file,$out,preg_SET_ORDER);同时,对于debuggingRegexp来说非常适合,但对于解析FDF来说并不适合,例如Chrome提交FDF
[]
Array
(
    [field_email)
    ] => email@email.com)

    [field_name)
    ] => John)

    [field_reference)
    ] => )

)
%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