PHP preg_split с двумя разделителями и захват только одного

Очень плохо разбираюсь в регулярных выражениях, заранее извините!

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

Если, например, у меня есть строка foo = bar AND bar=foo; Я хочу разделить строку либо на пробел, либо на символ =, НО сохранить =, чтобы массив выглядел так:

Array
(
    [0] => foo
    [1] => =
    [2] => bar
    [3] => AND
    [4] => bar
    [5] => =
    [6] => foo
)

К сожалению, я получаю это:

Array
(
    [0] => foo
    [1] => 
    [2] => =
    [3] => 
    [4] => bar
    [5] => AND
    [6] => bar
    [7] => =
    [8] => foo
)

У меня есть этот код (в PHP):

<!doctype html>
<?php

$string = 'foo = bar AND bar=foo';

$array = preg_split('/ +|(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);

?>
<pre>
<?php

print_r($array);

?>
</pre>

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


person Jonathon Oates    schedule 08.08.2012    source источник


Ответы (2)


Добавьте флаг PREG_SPLIT_NO_EMPTY:

$string = 'foo = bar AND bar=foo';
$array = preg_split('/ +|(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

Теперь это выводит:

Array
(
    [0] => foo
    [1] => =
    [2] => bar
    [3] => AND
    [4] => bar
    [5] => =
    [6] => foo
)
person nickb    schedule 08.08.2012
comment
Знаешь, иногда я действительно придурок! Спасибо! - person Jonathon Oates; 08.08.2012

Либо используйте PREG_SPLIT_NO_EMPTY, чтобы уничтожить "пустые" совпадения:

$array = preg_split('/ +|(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

Или измените регулярное выражение так, чтобы оно не создавало пустых совпадений:

$array = preg_split('/ +|(?<!\G)(=)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
person salathe    schedule 08.08.2012