RegEx或类似 - 抓取匹配值前的字符串

时间:2013-06-02 03:33:13

标签: php regex

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

收据上的格式为:

NAME OF ITEM 123456789012
OTHER NAME   987654321098
NAME         567890123456

所以,当我第二次回去找到物品的名称时,我完全失去了。我知道如何到达UPC所在的那一行,但是我怎样才能使用像regex这样的名字来获得UPC之前的名字?或者其他一些方法。我想以某种方式存储整行,然后用PHP解析它,但不知道如何获得该行。

使用PHP。

5 个答案:

答案 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以来已经有一段时间了,所以我无法给你一个确切的代码片段。

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