我正在尝试使用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当前函数(来源: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)
] => )
)为什么要总结)和新的路线?我知道这个问题对于理解regex表达式的人来说是微不足道的。所以我们会很感激你的帮助。
发布于 2013-08-10 14:23:17
描述
您的初始表达式只需查找表示每个键和值集的整个文本块。然后,在清理部分中,您将查找一个close paran,它后面紧跟字符串\)$的末尾,但我确信在close paran和字符串的末尾之间还有其他字符。
相反,我会在一次手术中处理这一切。这句话将:
field_子字符串修剪掉
^\/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\(([^)]*)\)

https://stackoverflow.com/questions/18161984
复制相似问题