我正在尝试使用 PHP 和正则表达式解析 FDF 文件。但我就是无法理解正则表达式。我一直在解析文件以生成数组。
%FDF-1.2
%âãÏÓ
1 0 obj
<<
/FDF
<<
/Fields [
<<
/V (<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fc99919d9590bc99919d9590d29f9391" rel="noreferrer noopener nofollow">[email protected]</a>)
/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)
] => <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="41242c20282d01242c20282d6f222e2c" rel="noreferrer noopener nofollow">[email protected]</a>)
[field_name)
] => John)
[field_reference)
] => )
)
为什么它会结束 )
和新行?我知道这个问题对于理解正则表达式的人来说是微不足道的。因此,我们将不胜感激。
最佳答案
描述
您的初始表达式只是查找代表每个键和值集的整个文本 block 。然后在清理部分中,您正在寻找一个紧随其后的紧跟字符串 \)$
结尾的关闭帕兰,但我确信关闭帕兰和结尾之间还有其他字符字符串的。
相反,我会在一次操作中处理所有这些。该表达式将:
- 查找字段值
- 修剪掉周围的括号
- 并放入捕获组 1
- 查找值的名称并将其放入捕获组 2 中
- 修剪
field_
子字符串 - 修剪掉周围的括号
- 并放入捕获组 2
- 修剪
- 需要选项:不区分大小写和多行
^\/V\s\(([^)]*)\)[\r\n]*^\/T\s\(field_([^)]*)\)
示例
示例文本
%FDF-1.2
%âãÏÓ
1 0 obj
<<
/FDF
<<
/Fields [
<<
/V (<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a7f777b73765a7f777b737634797577" rel="noreferrer noopener nofollow">[email protected]</a>)
/T (field_email)
>>
<<
/V (John)
/T (field_name)
>>
<<
/V ()
/T (field_reference)
>>]
>>
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF
匹配
[0][0] = /V (<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1d4dcd0d8ddf1d4dcd0d8dd9fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a>)
/T (field_email)
[0][1] = <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d7b2bab6bebb97b2bab6bebbf9b4b8ba" rel="noreferrer noopener nofollow">[email protected]</a>
[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\(([^)]*)\)
关于用于提取 FDF 数据的 PHP 正则表达式代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18161984/