PHP 将包含括号内数组的字符串拆分为多维数组

PHP Split String contains arrays inside bracket into Multidimensional Arrays

我有一个字符串,其中有由 {|} 分隔的数组,如下所示:

$string = "Hi, {Mr.|Mrs.} {Alvin|Dale}! Good Morning!";

我尝试过的许多事情之一:

$string = "Hi, {Mr.|Mrs.} {Alvin|Dale}! Good Morning!";
preg_match_all("/[()=]|\{[^\}]+\}|[+-]|[^=]+$/", $string, $matches);

预期结果:

$result = array ( 
0 => array ( 0 => 'Hi, '), 
1 => array ( 0 => 'Mr.', 1 => 'Mrs.'),
2 => array ( 0 => ' '), 
3 => array ( 0 => 'Alvin', 1 => 'Dale'), 
4 => array ( 0 => '! Good Morning!')
);

实际结果:

$result = array ( 
0 => 'Hi, {Mr.|Mrs.} {Alvin|Dale}! Good Morning!'
);

您能否解释一下 $string 是如何生成的,因为您的数组不正确

例如那些 {} 是通过 json 生成的: 例如:

$string = array(
    0 => 'Hi, ',
    1 => array(
        0 => 'Mr.',
        1 => 'Mrs.'
    )
);

$jsonOut = json_encode($string); // encodes array to json format

print_r('Json String: ' . $jsonOut);
print "\r\n";
print_r('Back To array format:');
print "\r\n";
print_r(json_decode($jsonOut, true)); // json_decode(#jsonString, true) brings back the original php array

在上面的示例中,您将获得以下输出(全部经过测试)

Json String: ["Hi, ",["Mr.","Mrs."]]
Back To array format:
Array
(
    [0] => Hi, 
    [1] => Array
        (
            [0] => Mr.
            [1] => Mrs.
        )

)

我已经使用你提供的数据让你有了一些了解(举例),但我无法为你完成整个脚本。

PHP Arrays PHP Json

您可以在匹配时拆分字符串,从左大括号到右大括号,并将使用该模式拆分的值保留在大括号内部的捕获组中

然后您可以使用 array_map 并在 | 上拆分。

例如

$pattern = "/{([^{}]+)}/";
$string = "Hi, {Mr.|Mrs.} {Alvin|Dale}! Good Morning!";
$result = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

$result = array_map(function($x) {
    return explode('|', $x);
}, $result);

输出

array (
  0 => 
  array (
    0 => 'Hi, ',
  ),
  1 => 
  array (
    0 => 'Mr.',
    1 => 'Mrs.',
  ),
  2 => 
  array (
    0 => ' ',
  ),
  3 => 
  array (
    0 => 'Alvin',
    1 => 'Dale',
  ),
  4 => 
  array (
    0 => '! Good Morning!',
  ),
)

看到一个PHP demo

PHP >= 7.4:

$string = "Hi, {Mr.|Mrs.} {Alvin|Dale}! Good Morning!";

preg_match_all('~{[^}]*}|[^{]+~', $string, $matches);

$result = array_map(
    fn($m) => $m[0] === '{' ? explode('|', trim($m, '{}')) : $m,
    $matches[0]
);