Preg_split захватил весь результат в массив - PullRequest
2 голосов
/ 13 февраля 2012

У меня проблема с функцией preg_split в php

Мое регулярное выражение

#^(-?[0-9]+)(([+x])(-?[0-9]+))*$#

Я хочу, например, преобразование:

-5+69x45

в массиве, подобном этому

{
[0] = -5
[1] = +
[2] = 69
[3] = x
[4] = 45
}

Мои регулярные выражения и математика с preg_match

Но с preg split у меня нет массива

У меня есть пустой массив без флага или

{
[0] = -5
[1] = x
[2] = 45
}

С флагом PREG_SPLIT_DELIM_CAPTURE

Где моя ошибка?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Я думаю, что вы неправильно поняли preg_split.

Определенный вами шаблон используется для разделения строки, но это означает, что те части строки, которые соответствуют вашему шаблону, не включаются в результирующий массив.

При использовании флага PREG_SPLIT_DELIM_CAPTURE содержимое групп захвата добавляется в результирующий массив ( preg_spit doc ).

#^(-?[0-9]+)(([+x])(-?[0-9]+))*$#
            ^^^^^^^^^^^^^^^^^^

Но у вас есть квантификатор здесьвокруг ваших двух последних групп, это означает, что в $ 2 и $ 3 хранится только последнее совпадение, а в первом совпадении этой группы "+69" перезаписывается, поэтому в вашем случае вы получите

$1 = -5
$2 = x
$3 = 45
0 голосов
/ 13 февраля 2012

Вы можете использовать этот код:

$str = '-5+69x45';
$arr = 
 preg_split('#([+x]|-?\d+)#', $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
print_r($arr);

ВЫХОД:

Array
(
    [0] => -5
    [1] => +
    [2] => 69
    [3] => x
    [4] => 45
)
...