php preg_match - поиск определенного номера / кода символа - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь найти шаблон числа / символа внутри строки.

Строка может выглядеть следующим образом

"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

До года может быть макс.строка из двух символов, за которой следует минус.Между этими двумя символами длинной сильной может быть знак минус или пробел.

Примеры:

"AA 2019"
"ZZ-2018"

Я обнаружил, что могу получить 6 цифр с /[0-9]{6}/.

Год /[0-9]{4}.Я хотел бы добавить, что это может быть только между 2000 and 2100

И я могу получить число между двумя знаками минус с помощью: /(?<=\-)(.*?)(?=\-)/ или

/\-(.*?)\-/


Например, у меня была идея найти число между двумя символами "-" и сохранить его в переменной.Затем, чтобы сказать, что я хочу, чтобы числа между этими числами после этой переменной составляли 6 символов в длину и между 000000 и 999999.

Аналогичная игра с этим годом.Я хотел бы сказать, что я получу число, которое находится перед переменной с «-». Максимальная длина составляет 4 числа и находится между 2000 и 2100.

Если я сохраню год впеременная, которую я могу теоретически сказать, я ищу две буквы, которые предшествуют "- $ yearvariable" или "[пробел] $ yearvariable

1 Ответ

1 голос
/ 01 июля 2019

Вы можете использовать

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

См. Демоверсию regex

Детали

  • \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 и более).

См. График регулярных выражений 1039 *:

enter image description here

enter image description here

Демонстрация PHP :

$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
)
...