【问题标题】:preg_match not matching more than 1 character at a time in string extracted from PDFpreg_match 在从 PDF 中提取的字符串中一次不匹配超过 1 个字符
【发布时间】:2016-01-12 04:39:20
【问题描述】:

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

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

当我使用 preg_match 匹配单个字符时,例如字母 i,我得到一个大写 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 ),发现“发票”这个词的十六进制代码是“0049006e0076006f006900630065”。如果正确表示,它实际上是“496e766f696365”。所以我的PDF字符串中的每个字母之间都有一个十六进制值为“00”的字符。我将如何摆脱它们?

【问题讨论】:

  • 您在$regex = "/invoice/i" 之后缺少一个分号......但假设这不是问题所在......
  • 谢谢,已修复。不过不是问题。
  • 如果你这样做echo htmlentities(print_r($pdfText, true));,pdfText的价值是多少?
  • 看起来和以前一模一样。
  • 试试...preg_replace('/[\x00]/', '', $string);

标签: php regex string pdf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 2017-12-14
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多