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.
)
)
我已经使用你提供的数据让你有了一些了解(举例),但我无法为你完成整个脚本。
您可以在匹配时拆分字符串,从左大括号到右大括号,并将使用该模式拆分的值保留在大括号内部的捕获组中
然后您可以使用 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]
);
我有一个字符串,其中有由 {|} 分隔的数组,如下所示:
$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.
)
)
我已经使用你提供的数据让你有了一些了解(举例),但我无法为你完成整个脚本。
您可以在匹配时拆分字符串,从左大括号到右大括号,并将使用该模式拆分的值保留在大括号内部的捕获组中
然后您可以使用 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]
);