0

这是交易,我正在处理一个 OCR 文本文档并使用 RegEx 从中获取 UPC 信息。那部分我已经想通了。然后我查询一个数据库,如果我没有该 UPC 的记录,我需要返回到文本文档并获取产品的描述。

收据上的格式是:

NAME OF ITEM 123456789012
OTHER NAME   987654321098
NAME         567890123456

所以,当我第二次回去寻找物品的名称时,我完全不知所措。我知道如何到达 UPC 所在的行,但是如何使用正则表达式之类的东西来获取 UPC 之前的名称?或者其他一些方法。我正在考虑以某种方式存储整行,然后用 PHP 解析它,但也不知道如何获取该行。

使用 PHP。

4

5 回答 5

3

使用正则表达式和 获取由其 UPC 索引的项目的所有名称preg_match_all()

$str = 'NAME OF ITEM 123456789012
OTHER NAME   987654321098
NAME         567890123456';
preg_match_all( '/^(.*?)\s+(\d+)/m', $str, $matches);

$items = array();
foreach( $matches[2] as $k => $upc) {
    if( !isset( $items[$upc])) {
        $items[$upc] = array( 'name' => $matches[1][$k], 'count' => 0);
    }
    $items[$upc]['count']++;
}

这种形式$items看起来像:

Array ( 
    [123456789012] => NAME OF ITEM 
    [987654321098] => OTHER NAME 
    [567890123456] => NAME 
)

现在,您可以及时查找所需的任何项目名称O(1),如本演示所示:

echo $items['987654321098']; // OTHER NAME
于 2013-06-02T03:41:54.557 回答
0

我很懒,所以我只会使用一个正则表达式,它可以使用匹配组一次性获取两个部分。然后,我每次都会调用它,并将每个捕获组放入 name 和 upc 变量中。对于需要名称的情况,只需引用它即可。

使用这种类型的正则表达式:

/([a-zA-Z ]+)\s*(\d*)/

然后,您将拥有 $1 匹配组中的名称和 $2 匹配组中的 UPC。对不起,我已经有一段时间没有使用 php 了,所以我不能给你一个确切的代码片段。

注意:建议的正则表达式假定您的“名称”中只有字母或空格,如果不是这种情况,则必须扩展字符类。

于 2013-06-02T04:07:30.330 回答
0

您可以使用以下正则表达式找到您知道的值之前的字符串:

$receipt = "NAME OF ITEM 123456789012\n" .
           "OTHER NAME   987654321098\n" .
           "NAME         567890123456";
$upc = '987654321098';
if (preg_match("/^(.*?) *{$upc}/m", $receipt, $matches)) {
    $name = $matches[1];
    var_dump($name);
}

正则表达式上的 /m 标志使 ^ 在多行输入中正常工作。in使
该部分不贪婪,因此它不会占用所有空间?(.*?)

于 2013-06-02T03:40:37.860 回答
0

如果您在初始通道中同时抓住名称和号码,会更简单。然后,当您检查数据库以查看该号码是否存在时,如果您需要使用它,您已经有了该名称。考虑:

preg_match_all('^([A-Za-z ]+) (\d+)$', $document, $matches, PREG_SET_ORDER);

foreach ($matches 作为 $match) {
    $name = $match[1];
    $number = $match[2];

    if (!order_number_in_database($number)) {
        save_new_order($number, $name);
    }
}
于 2013-06-02T03:41:05.067 回答
0

您可以使用前瞻断言来匹配 UPC 之前的字符串。 http://php.net/manual/en/regexp.reference.assertions.php

通过这样的方式:^\S*(?=\s*123456789012)将 UPC 替换为您要查找的项目的 UPC。

于 2013-06-02T03:45:57.237 回答