2015-09-17 7 views
0

Я пытаюсь разобрать строку на компоненты. Мое решение работает для полных строк, но я хочу учесть строки с потенциально меньшим количеством компонентов. Например, я хочу иметь возможность сопоставлять G02F 1/1335, G02F 1, G02F и т. Д. С preg_match, если не все группы захвата совпадают, весь вывод недействителен.php preg_match частичное совпадение

$string = 'G02F 1/1335'; 
$string = strtoupper(preg_replace('/\s+/', '', $string)); 
preg_match('%^([A-H])([0-9]{1,2})([A-Z])([0-9]{1,4})/([0-9]{1,6})$%', $string, $parsed); 
+2

Вы можете сделать символы или матч группу факультативной с '' – mario

+1

затем вывезти '^ и $', который заставляет регулярное выражение использовать всю строку. –

+0

Вам нужно извлечь что-то конкретное из строки или только для проверки формата? –

ответ

1

Как @mario предложено в комментариях, сделать подшаблоны факультативных с ?:

preg_match('%^([A-H])(\d{1,2})([A-Z])\s*(\d{1,4})?/?(\d{1,6})?$%', $string, $parsed); 
+0

Это замечательно. Есть ли способ принять только поле, если оно следует за предыдущим допустимым полем? Например, 'G02F 1' действителен, но' GF/1335' недействителен. – Rachie

+0

Нет совпадений для кода типа 'GF/1335', имеются совпадения для кода типа' G02F/1335', а так как четвертая часть отсутствует в теме (но необязательна в шаблоне), этот элемент в массиве 'matches' существует и пустой. Вы можете проверить массив 'matches' для пустых элементов, чтобы убедиться, что все части там. – Danijel

Смежные вопросы