首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取FDF数据的PHP regex代码

提取FDF数据的PHP regex代码
EN

Stack Overflow用户
提问于 2013-08-10 12:42:03
回答 1查看 1.6K关注 0票数 2

我正在尝试使用PHP解析FDF文件,并使用regex。但我就是想不出我的想法。我不得不解析这个文件来生成一个数组。

代码语言:javascript
复制
%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)

代码语言:javascript
复制
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;
}

结果:

代码语言:javascript
复制
Array
(
    [field_email)
    ] => email@email.com)

    [field_name)
    ] => John)

    [field_reference)
    ] => )

)

为什么要总结)和新的路线?我知道这个问题对于理解regex表达式的人来说是微不足道的。所以我们会很感激你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-10 14:23:17

描述

您的初始表达式只需查找表示每个键和值集的整个文本块。然后,在清理部分中,您将查找一个close paran,它后面紧跟字符串\)$的末尾,但我确信在close paran和字符串的末尾之间还有其他字符。

相反,我会在一次手术中处理这一切。这句话将:

  • 查找字段值
    • 把周围的父母修剪掉
    • 并将其放入第一组

  • 在捕获组2 中查找值和位置的名称
    • field_子字符串修剪掉
    • 把周围的父母修剪掉
    • 并将其放入第二组

  • 需要以下选项:不区分大小写和多行。

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

示例

现场演示

样本文本

代码语言:javascript
复制
%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

匹配

代码语言:javascript
复制
[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\(([^)]*)\)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18161984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档