function split_and_keep(string $text, array $delims): array {
if ($text === '') {
return [];
}
$delimSet = array_flip($delims); // fast lookup
$result = [];
$start = 0;
$len = strlen($text);
for ($i = 1; $i < $len; $i++) {
$prev = $text[$i - 1];
$curr = $text[$i];
$prevIsDelim = isset($delimSet[$prev]);
$currIsDelim = isset($delimSet[$curr]);
$shouldSplit =
($prevIsDelim xor $currIsDelim) || // text ↔ delim
($prevIsDelim && $currIsDelim && $prev !== $curr); // delim type changed
if ($shouldSplit) {
$result[] = substr($text, $start, $i - $start);
$start = $i;
}
}
// Add final segment
$result[] = substr($text, $start);
return $result;
}
$s = "aa==bbb---cccc++++ddddd";
$delimiters = ["=", "-", "+"];
$parts = split_and_keep($s, $delimiters);
foreach ($parts as $p) {
echo "[$p] ";
}
/*
run:
[aa] [==] [bbb] [---] [cccc] [++++] [ddddd]
*/