在每次出现 3 个特定定界符之前拆分一个字符串

Split a string just before each occurrence of 3 specific delimiters

在解析具有多个定界符的字符串并将定界符保留在拆分的 'after' 部分时,我对 preg_split() 有点迷茫。

我的分隔符是 $#?

例如:

$str = 'participant-$id#-group';
$ar = preg_split('/([^$#?]+[$#?]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
echo "<pre>";  print_r( $ar); echo "</pre>";

将显示:

Array
(
    [0] => participant_data-$
    [1] => id#
    [2] => -group
)

不过我需要:

Array
(
    [0] => participant_data-
    [1] => $id
    [2] => #-group
)

正则表达式让我的大脑受伤。那么有人可以建议我如何使用 PREG_SPLIT_DELIM_CAPTURE 并将分隔符保留在段的开头吗?

试试这个:

$ar = preg_split('/($[^#]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

这个怎么样。我正在捕获分隔符,然后将它们放回原处。

<?php

$str = 'participant-$id#-group';
$ar = preg_split('/([^$#?]+[^$#?]+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
echo "<pre>";  print_r( $ar); echo "</pre>";  

/*
Array
(
    [0] => participant-
    [1] => $
    [2] => id
    [3] => #
    [4] => -group
) */

$result = array();
$result[] = $ar[0];
for($i=1;$i<count($ar);$i+=2) {
    $result[] = $ar[$i] . $ar[$i+1];
}

echo "<pre>";  print_r( $result); echo "</pre>";  

/*
Array
(
    [0] => participant-
    [1] => $id
    [2] => #-group
)
*/

?>

您不需要捕获分隔符,只需对 $#? 使用前瞻性。这将在分隔符之前的 zero-width 位置拆分您的字符串。没有角色会lost/consumed为什么会爆

代码:(Demo)

$str = 'participant-$id#-group';

var_export(
    preg_split('/(?=[$#?])/', $str)
);

输出:

array (
  0 => 'participant-',
  1 => '$id',
  2 => '#-group',
)