[英]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.