这是交易,我正在处理OCR文本文档并使用RegEx从中获取UPC信息。那部分我已经想通了。然后我查询数据库,如果我没有该UPC的记录,我需要回到文本文档并获得产品的描述。
收据上的格式为:
NAME OF ITEM 123456789012
OTHER NAME 987654321098
NAME 567890123456
所以,当我第二次回去找到物品的名称时,我完全失去了。我知道如何到达UPC所在的那一行,但是我怎样才能使用像regex这样的名字来获得UPC之前的名字?或者其他一些方法。我想以某种方式存储整行,然后用PHP解析它,但不知道如何获得该行。
使用PHP。
答案 0 :(得分:3)
使用正则表达式preg_match_all()
获取由其UPC索引的所有项目的名称:
$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)
时间内查找所需的任何项目名称,如this demo中所示:
echo $items['987654321098']; // OTHER NAME
答案 1 :(得分: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标志使^在多行输入时正常工作
?
中的(.*?)
使得该部分非贪婪,因此它不会占用所有空格
答案 2 :(得分:0)
如果在初始传球期间同时抓住名称和号码,会更简单。然后,当您检查数据库以查看该数字是否存在时,如果您需要使用它,则您已经拥有该名称。考虑:
preg_match_all('^([A-Za-z ]+) (\d+)$', $document, $matches, PREG_SET_ORDER); foreach ($matches as $match) { $name = $match[1]; $number = $match[2]; if (!order_number_in_database($number)) { save_new_order($number, $name); } }
答案 3 :(得分:0)
您可以使用超前断言来匹配UPC之前的字符串。 http://php.net/manual/en/regexp.reference.assertions.php
通过以下方式:^\S*(?=\s*123456789012)
将UPC替换为您要查找的项目的UPC。
答案 4 :(得分:0)
我很懒,所以我会使用一个正则表达式,使用匹配组一次性获取两个部分。然后,我每次都会调用它,并将每个捕获组放入name和upc变量中。对于需要名称的情况,请参考它。
使用这种类型的正则表达式:
/([a-zA-Z ]+)\s*(\d*)/
然后,您将在$ 1匹配组中拥有该名称,并在UPC中拥有$ 2匹配组。对不起,自从我使用php以来已经有一段时间了,所以我无法给你一个确切的代码片段。
注意:建议的正则表达式假设您的“名称”中只有字母或空格,如果不是这样,则必须扩展字符类。