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

尝试添加$,例如:

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 回答
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 回答