preg_match在从PDF中提取的字符串中一次不匹配多于1个字符

时间:2016-01-12 04:39:21

标签: php regex string pdf

我使用了一个名为pdfparser的库来从PDF中提取文本。我成功地这样做了,但是我对提取的文本有一些奇怪的问题。字符串如下所示:

Invoice
Date
1/8/2016
Invoice #
1679105
Bill To
etc...

当我使用preg_match来匹配单个字符时,就像字母i一样,我得到一个资本我作为回报,如果我使用preg_match_all,我得到一系列大写和小写字母I按照你期望的顺序。但是,如果我尝试“in”,我什么也得不到,当它应该在“Invoice”中返回“In”时。这适用于我在搜索中尝试的任何字母组合。

这是将PDF数据(来自电子邮件附件)转换为ASCII字符串的原因:

$parser = new \Smalot\PdfParser\Parser();
$pdf    = $parser->parseContent($body);
$pages  = $pdf->getPages();
$pdfText = "";
foreach ($pages as $pageNum => $page)
    $pdfText .= "\n\tPage $pageNum\n".$page->getText();

这就是搜索文档的内容:

$regex = "/invoice/i";
preg_match_all($regex, $pdfText, $test);
echo "<h2>PDF Text</h2><pre>$pdfText</pre>";
echo "<pre><b>Search Results for $regex</b>".print_r($test,1)."</pre>";

这将返回0结果。即使像$regex = "/[0-9]{2,}/"这样简单的事情也不会返回任何结果

编辑:我通过$ pdfText复制并粘贴了浏览器中显示的文本,然后将其作为字符串粘贴到我的php文件中,并使用完全相同的代码进行搜索。搜索工作完全正常。

编辑2:发现问题。但我仍然需要帮助。我使用函数bin2hex( $pdfText ),发现单词“invoice”的十六进制代码为“0049006e0076006f006900630065”。如果正确表示,它实际上是“496e766f696365”。因此,我的PDF字符串中的每个字母之间都有一个字符,其十六进制值为“00”。我怎么能摆脱它们呢?

1 个答案:

答案 0 :(得分:1)

要修复包含不需要的十六进制值的字符,可以使用此方法替换它。

preg_replace('/\x00/', '', $string);