Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_match在从PDF提取的字符串中一次不匹配超过1个字符_Php_Regex_String_Pdf - Fatal编程技术网

Php preg_match在从PDF提取的字符串中一次不匹配超过1个字符

Php preg_match在从PDF提取的字符串中一次不匹配超过1个字符,php,regex,string,pdf,Php,Regex,String,Pdf,我使用一个名为pdfparser的库从PDF中提取文本。我成功地做到了这一点,但是我在提取文本时遇到了一些棘手的问题。字符串如下所示: Invoice Date 1/8/2016 Invoice # 1679105 Bill To etc... 当我使用preg_match匹配单个字符时,比如字母I,我会得到一个大写字母I作为回报,如果我使用preg_match_all我会得到一个大小写字母I的数组,按照您期望的顺序排列。但如果我尝试“输入”,我什么也得不到,而它应该在“发票”中返回“输入”。

我使用一个名为pdfparser的库从PDF中提取文本。我成功地做到了这一点,但是我在提取文本时遇到了一些棘手的问题。字符串如下所示:

Invoice
Date
1/8/2016
Invoice #
1679105
Bill To
etc...
当我使用
preg_match
匹配单个字符时,比如字母I,我会得到一个大写字母I作为回报,如果我使用
preg_match_all
我会得到一个大小写字母I的数组,按照您期望的顺序排列。但如果我尝试“输入”,我什么也得不到,而它应该在“发票”中返回“输入”。这适用于我在搜索中尝试的任何字母组合

这就是将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>";
$regex=“/invoice/i”;
preg_match_all($regex、$pdfText、$test);
回显“PDF文本$pdfText”;
回显“搜索$regex的结果”。打印($test,1)。”;
这将返回0个结果。即使像
$regex=“/[0-9]{2,}/”
这样简单的东西也不会返回任何结果

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


编辑2:找到了问题。但我仍然需要帮助。我使用函数
bin2hex($pdfText)
发现单词“invoice”的十六进制代码为“0049006E0076006F00690063065”。如果正确表示,它实际上是“496e766f696365”。因此,在我的PDF字符串中,每个字母之间都有一个字符,十六进制值为“00”。如何将它们全部删除?

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


$regex=“/invoice/i”
之后缺少分号。。。但假设这不是问题所在…谢谢,修正了。但这不是问题。如果您执行
echo htmlentities(print_r($pdfText,true)),pdfText的值是多少?看起来和以前完全一样。请尝试<代码>preg_replace('/[\x00]/','.$string)
preg_replace('/\x00/', '', $string);