簡體   English   中英

RegEx或類似-匹配值之前的字符串

[英]RegEx or Similar - Grab string preceding matched value

這是交易,我正在處理OCR文本文檔,並使用RegEx從中獲取UPC信息。 我已經知道了那部分。 然后,我查詢一個數據庫,如果沒有該UPC的記錄,則需要返回文本文檔並獲取產品說明。

收據上的格式為:

NAME OF ITEM 123456789012
OTHER NAME   987654321098
NAME         567890123456

因此,當我第二次返回以查找商品名稱時,我完全不知所措。 我知道如何到達UPC所在的行,但是如何使用正則表達式之類的東西來獲取UPC之前的名稱? 或其他方法。 我正在考慮以某種方式存儲整個行,然后用PHP對其進行解析,但不確定如何獲取該行。

使用PHP。

使用正則表達式和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)時間內查找所需的任何項目名稱,如本演示所示

echo $items['987654321098']; // OTHER NAME

您可以使用以下正則表達式找到一個已知值之前的字符串:

$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標志使^與多行輸入一起正常工作。
? (.*?)中的部分使該部分不貪心,因此它不會占用所有空格

如果您在初始通行證中同時抓取姓名和電話號碼,將會更簡單。 然后,當您檢查數據庫以查看該數字是否存在時,如果您需要使用該名稱,則已經有了該名稱。 考慮:

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);
    }
}

您可以使用先行斷言來匹配UPC之前的字符串。 http://php.net/manual/zh/regexp.reference.assertions.php

通過這樣的操作: ^\\S*(?=\\s*123456789012)將UPC替換為您要查找的項目的UPC。

我很懶,所以我只用一個正則表達式,使用匹配組將兩個部分合為一體。 然后,我每次都會調用它,並將每個捕獲組放入名稱和upc變量中。 對於需要名稱的情況,只需引用它。

使用這種類型的正則表達式:

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

然后,您將在$ 1匹配組中擁有該名稱,而UPC在$ 2匹配組中具有該名稱。 抱歉,自從我使用php已經有一段時間了,所以我不能為您提供確切的代碼段。

注意:建議的正則表達式假設您的“名稱”中僅包含字母或空格,如果不是這種情況,則必須擴展字符類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM