0

これが取り引きです。私はOCRテキストドキュメントを処理し、RegExを使用してそこからUPC情報を取得しています。その部分は私が理解しました。次に、データベースにクエリを実行し、その UPC の記録がない場合は、テキスト ドキュメントに戻って製品の説明を取得する必要があります。

領収書のフォーマットは次のとおりです。

NAME OF ITEM 123456789012
OTHER NAME   987654321098
NAME         567890123456

そのため、アイテムの名前を見つけるために2回目に戻ったとき、私は完全に途方に暮れています. 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

私は怠け者なので、一致するグループを使用して 1 つのショットで両方の部分を取得する 1 つの正規表現を使用します。次に、毎回呼び出して、各キャプチャ グループを name 変数と upc 変数に入れます。名前が必要な場合は、それを参照してください。

次のタイプの正規表現を使用します。

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

次に、$1 一致グループに名前があり、UPC が $2 一致グループにあります。申し訳ありませんが、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 に答える