2016-05-26 2 views
3

Я пытаюсь разделить строку «A123456789123B» на шесть групп, используя следующее регулярное выражение:Как разбить строку на группы с помощью регулярных выражений

'/^([A-Z]{1})([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3})([A-Z]{1})$/' 

Я попытался с помощью:

preg_split('/^([A-Z]{1})([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3})([A-Z]{1})$/', 'A123456789123B'); 

Однако это не работает.

мне нужно разбить строку на что-то вроде этого:

['A', '123', '456', '789', '123', 'B'] 
+0

Число символов в каждом блоке фиксировано? – user4035

+0

Подумайте о preg_split с сбросом: ['(?: ^. | ...) \ K'] (https://regex101.com/r/lD1vI7/1), но это интересно дает [разные результаты в разных php версии] (https://3v4l.org/aJ0nT). –

ответ

5

Было бы лучше подходит для использования preg_match() для этого:

preg_match('/^([A-Z]{1})(\d{3})(\d{3})(\d{3})(\d{3})([A-Z]{1})$/', 'A123456789123B', $matches); 
array_shift($matches); 

Ваш массив матчей будут храниться в $matches. Первый элемент $matches будет содержать всю указанную строку, а остальные элементы будут конкретными группами захвата в круглых скобках. Мы используем array_shift() для удаления первого элемента.

Вот пример:

php > var_dump(preg_match('/^([A-Z]{1})(\d{3})(\d{3})(\d{3})(\d{3})([A-Z]{1})$/', 'A123456789123B', $matches)); 
int(1) 
php > var_dump($matches); 
array(7) { 
    [0]=> 
    string(14) "A123456789123B" 
    [1]=> 
    string(1) "A" 
    [2]=> 
    string(3) "123" 
    [3]=> 
    string(3) "456" 
    [4]=> 
    string(3) "789" 
    [5]=> 
    string(3) "123" 
    [6]=> 
    string(1) "B" 
} 
php > array_shift($matches); 
php > var_dump($matches); 
array(6) { 
    [0]=> 
    string(1) "A" 
    [1]=> 
    string(3) "123" 
    [2]=> 
    string(3) "456" 
    [3]=> 
    string(3) "789" 
    [4]=> 
    string(3) "123" 
    [5]=> 
    string(1) "B" 
} 
php > 
4

Я думаю, вы скорее должны использовать preg_match причину раскола будет искать сепараторе и у вас нет здесь:

$str = 'A123456789123B'; 
preg_match('/^([A-Z]{1})([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{3})([A-Z]{1})$/', $str, $matches); 
var_dump($matches); 

Тогда вам придется удалить первый ключ из $ спичек:

if ($matches) { 
    array_shift($matches) 
} 
Смежные вопросы