Возможно ли это при использовании preg_split
вернуть разделители в массив в том порядке, в котором они были найдены?
Возьмем для примера:
$string = "I>am+awesome";
preg_split("/>|\+/", $string);
а затем получить вывод примерно так:
Array(
Array(
0 => "I",
1 => "am",
2 => "awesome"),
Array (
0 => ">"1 => "+")
)
Я понимаю, что мог бы выполнить разбиение, а затем перебрать исходную строку и добавить их, как только они будут найдены, но я ищу лучший способ, если он есть.
Используйте группу захвата ()
а также PREG_SPLIT_DELIM_CAPTURE
:
preg_split("/(>|\+)/", $string, 0, PREG_SPLIT_DELIM_CAPTURE);
Или, как утверждает @hsz (>|\+)
был бы лучший образец.
Вот способ добиться этого с упреждением и без использования PREG_SPLIT_DELIM_CAPTURE
чтобы заставить это регулярное выражение работать на других платформах, таких как Java, где нет такого флага:
print_r( preg_split('/(?<=[>|+])|(?=[>|+])/', $string ) );
Array
(
[0] => I
[1] => >
[2] => am
[3] => +
[4] => awesome
)
$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) ">"}