2

注文番号を一致させようとしています (常に ABC + 6 または 7 桁の形式です)。例: ABC123456 または ABC1234567

私は持っている:

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})/", $content, $matches);

しかし、誰かが私たちに ABC12345678 を引用した場合、それは ABC1234567 を抽出しています。これは正しくありません。代わりに、preg_match_all によって一致が見つからないはずです。

「ABCのすべての出現に続いて6桁または7桁。7番目の文字の後の文字が数字であるものはすべて無視する」と言うように正規表現を修正するにはどうすればよいですか?

4

5 に答える 5

3

否定的な先読みが必要です:

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9])/", $content, $matches);

これは ABC1234567 と一致し、数字以外の 7 の後にすべて一致します。

の部分(?![0-9])が一致しない場合にのみ、前の部分が(?!...)一致します。7そのため、どちらでもない後に文字が必要ない場合は、次のようにします。

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9a-zA-Z])/", $content, $matches);

_文字も必要ない場合は、次のようにします。

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})(?![0-9a-zA-Z_])/", $content, $matches);

これは実際には以下を使用することと同等です\b:

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})\b/", $content, $matches);
于 2013-05-23T13:49:21.673 に答える
2
  1. 6 桁と 7 桁の小切手を 1 つにまとめることができます
  2. 単語境界または入力開始/終了アンカーを使用する

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

/\b(ABC)[0-9]{6,7}\b/

また

/^(ABC)[0-9]{6,7}$/
于 2013-05-23T13:49:26.010 に答える
0

次のパターンも使用できます。

^(ABC)\d{6,7}$

ここ

^     = Starts with 
(ABC) = ABC
\d    = followed by digits between 0-9 inclusive.
{6,7} = 6 or 7 times
$     = till the end of the order number
于 2013-05-23T14:00:45.413 に答える
0

$次のように追加してみてください。

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7})$/", $content, $matches);
于 2013-05-23T13:49:09.473 に答える
0

単語の末尾を次のように指定します

preg_match_all("/(ABC)([0-9]{6}|[0-9]{7}\>)/", $content, $matches);
于 2013-05-23T13:50:35.520 に答える