preg_split получить разделители в массиве

Возможно ли это при использовании preg_split вернуть разделители в массив в том порядке, в котором они были найдены?

Возьмем для примера:

$string = "I>am+awesome";
preg_split("/>|\+/", $string);

а затем получить вывод примерно так:

Array(
Array(
0 => "I",
1 => "am",
2 => "awesome"),
Array (
0 => ">"1 => "+")
)

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

0

Решение

Используйте группу захвата () а также PREG_SPLIT_DELIM_CAPTURE:

preg_split("/(>|\+)/", $string, 0, PREG_SPLIT_DELIM_CAPTURE);

Или, как утверждает @hsz (>|\+) был бы лучший образец.

1

Другие решения

Вот способ добиться этого с упреждением и без использования PREG_SPLIT_DELIM_CAPTURE чтобы заставить это регулярное выражение работать на других платформах, таких как Java, где нет такого флага:

print_r( preg_split('/(?<=[>|+])|(?=[>|+])/', $string ) );
Array
(
[0] => I
[1] => >
[2] => am
[3] => +
[4] => awesome
)
1

$str = "I+>amaw+e+s>om>e";
$matches =  preg_split("/(>|\+)/",$str);
$all_matches = preg_split("/(>|\+)/", $str ,null, PREG_SPLIT_DELIM_CAPTURE);
$delimeters_order = array_diff($all_matches,$matches);
var_dump($delimeters_order);

array(6) {
[1]=>
string(1) "+"[3]=>
string(1) ">"[5]=>
string(1) "+"[7]=>
string(1) "+"[9]=>
string(1) ">"[11]=>
string(1) ">"}
0
По вопросам рекламы [email protected]