php preg_match - 搜索特定的 number/character 代码

php preg_match - search for specific number/character code

我正在尝试在字符串中搜索 number/character 模式。

字符串可以像这样

"any text CA-2019-6-000000 any text" 
"any text KA 2019-2-929029" // note: no "-" between the "KA and 2019" 
"KA-2019-11-929029" 

我可以明确地说,总有一年,比如 2000/2019/2055。 年份之后总是一个减号,两个可能的数字 1-12 和另一个减号。

几月

在“-<num>-”之后是一个6位长的数字,最少可以是000000,最多可以是999999

年之前,最多可以。两个字符长的字符串后跟一个减号。 在这两个字符之间 long strong 可以是减号或 space 字母。

示例:

"AA 2019"
"ZZ-2018"

我发现我可以用 /[0-9]{6}/ 得到 6 个数字。

年份 /[0-9]{4}。我想补充一点,它只能在 2000 and 2100

之间

我可以通过以下方式得到两个减号之间的数字:/(?<=\-)(.*?)(?=\-)/

/\-(.*?)\-/


例如,我有想法寻找两个“-”字符之间的数字并将其存储在一个变量中。 然后说我想要这个变量之后的数字,长度为 6 个字符,介于 000000 和 999999 之间。

与当年类似的游戏。我想说我会得到带有“--”的变量之前的数字。最大长度为 4 个数字,介于 2000 和 2100 之间。

如果我将年份存储在一个变量中,理论上我可以说我正在寻找“-$yearvariable”或“[space]$yearvariable

之前的两个字母

您可以使用

\b([A-Z]{2})[-\s](20[0-9]{2}|2100)-(0?[1-9]|1[0-2])-(\d{6})(?!\d)

regex demo

详情

  • \b - 单词边界
  • ([A-Z]{2}) - 两个大写字母
  • [-\s] - 连字符或空格
  • (20[0-9]{2}|2100) - 从 2000 到 2100 的数字
  • - - 一个连字符
  • (0?[1-9]|1[0-2]) - 从 1 到 12 的一个月
  • - - 一个连字符
  • (\d{6})(?!\d) - 6 位数字(没有 7 或更多)。

参见 regex graph:

PHP demo:

$s = "any text CA-2019-6-000000 any text";
if (preg_match('~\b([A-Z]{2})[-\s](20[0-9]{2}|2100)-(0?[1-9]|1[0-2])-(\d{6})(?!\d)~', $s, $m)) { 
    print_r($m);
}

输出:

Array
(
    [0] => CA-2019-6-000000
    [1] => CA
    [2] => 2019
    [3] => 6
    [4] => 000000
)