php preg_split 将字符串从方括号拆分为数组

php preg_split split string to array from square brackets

我想从方括号中拆分字符串而不删除任何字符。我尝试了以下代码,但它对我不起作用。

$value = "<p>&nbsp;Lorem ipsum dolor [State] sit amet, consectetur [City] adipisicing [TopJob7] elit, sed do eiusmod [JobType]</p>";

$tagsReplace = preg_split('/[\[]*[\][]/U', $value, -1);

echo '<pre>';
print_r( $tagsReplace );
exit;

当我运行上面的代码时,我得到了类似

的输出
Array
(
    [0] => <p>&nbsp;Lorem ipsum dolor 
    [1] => State
    [2] =>  sit amet, consectetur 
    [3] => City
    [4] =>  adipisicing 
    [5] => TopJob7
    [6] =>  elit, sed do eiusmod 
    [7] => JobType
    [8] => </p>
)

我想要如下输出。

Array
(
    [0] => <p>&nbsp;Lorem ipsum dolor 
    [1] => [State]
    [2] =>  sit amet, consectetur 
    [3] => [City]
    [4] =>  adipisicing 
    [5] => [TopJob7]
    [6] =>  elit, sed do eiusmod 
    [7] => [JobType]
    [8] => </p>
)

请帮我看看哪里写错了。

您的模式 [\[]*[\][] 匹配 0+ 次左括号,然后是左括号或右括号,给您一个 [ 或 n ]

为了保留分隔符,您可以在从 [] 的匹配组中捕获分隔符,并使用匹配而不是右括号的否定字符 class 来匹配它们之间的内容。

使用 PREG_SPLIT_DELIM_CAPTURE 标志保留分隔符。

请注意,您不需要 /U 标志。

(\[[^]]+\])

说明

  • ( 捕获组
    • \[ 匹配 [
    • [^]]+ 匹配 1+ 次不是 ]
    • \] 匹配 ]
  • ) 关闭群组

Regex demo | Php demo

例如:

$value = "<p>&nbsp;Lorem ipsum dolor [State] sit amet, consectetur [City] adipisicing [TopJob7] elit, sed do eiusmod [JobType]</p>";
$tagsReplace = preg_split('/(\[[^]]+\])/', $value, -1, PREG_SPLIT_DELIM_CAPTURE);
print_r( $tagsReplace );