从字符串中获取键和值
Getting key and value from string
<?php
// This is my string
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
// This is my pattern
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
$output = preg_split($pattern, $input);
print_r($output);
?>
它输出:
Array ( [0] => Lorum ipsum [1] => sit [2] => consectetur adipiscing elit. )
但我想要:
Array (
[foo] => dolor,
[bar] => amet
)
我做错了什么?
您可以使用 preg_match_all,它会多次应用给定的模式来查找字符串中的所有匹配项,并将它们累积到数组中的输出变量(这是第三个参数)中,如下所示:
Array
(
[0] => Array
(
[0] => [tag=foo]dolor[/tag]
[1] => [tag=bar]amet[/tag]
)
[1] => Array
(
[0] => foo
[1] => bar
)
[2] => Array
(
[0] => dolor
[1] => amet
)
)
其中索引 [0]
包含整个正则表达式的所有匹配项,索引 [1]
包含模式中第一个捕获组(括号)的匹配项,[2]
第二个。
然后您需要做的就是将 [1]
和 [2]
中的数组合并为一个,因此 [1]
中的值进入键,[2]
中的值进入新数组。这可以使用 array_combine
来完成
<?php
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
if (preg_match_all($pattern, $input, $regexpresult)) {
$output = array_combine($regexpresult[1], $regexpresult[2]);
print_r($output);
}
输出为:
Array
(
[foo] => dolor
[bar] => amet
)
请使用preg_match_all获取此类索引,数组中的0个索引是匹配项,1个索引是标签名称,2个索引是标签值。
1 和 2 索引与您需要的键值的位置完全相同。
<?php
// This is my string
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
// This is my pattern
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
preg_match_all($pattern, $input, $output);
print_r($output);
OUTPUT:
Array
(
[0] => Array
(
[0] => [tag=foo]dolor[/tag]
[1] => [tag=bar]amet[/tag]
)
[1] => Array
(
[0] => foo
[1] => bar
)
[2] => Array
(
[0] => dolor
[1] => amet
)
)
<?php
// This is my string
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
// This is my pattern
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
$output = preg_split($pattern, $input);
print_r($output);
?>
它输出:
Array ( [0] => Lorum ipsum [1] => sit [2] => consectetur adipiscing elit. )
但我想要:
Array (
[foo] => dolor,
[bar] => amet
)
我做错了什么?
您可以使用 preg_match_all,它会多次应用给定的模式来查找字符串中的所有匹配项,并将它们累积到数组中的输出变量(这是第三个参数)中,如下所示:
Array
(
[0] => Array
(
[0] => [tag=foo]dolor[/tag]
[1] => [tag=bar]amet[/tag]
)
[1] => Array
(
[0] => foo
[1] => bar
)
[2] => Array
(
[0] => dolor
[1] => amet
)
)
其中索引 [0]
包含整个正则表达式的所有匹配项,索引 [1]
包含模式中第一个捕获组(括号)的匹配项,[2]
第二个。
然后您需要做的就是将 [1]
和 [2]
中的数组合并为一个,因此 [1]
中的值进入键,[2]
中的值进入新数组。这可以使用 array_combine
<?php
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
if (preg_match_all($pattern, $input, $regexpresult)) {
$output = array_combine($regexpresult[1], $regexpresult[2]);
print_r($output);
}
输出为:
Array
(
[foo] => dolor
[bar] => amet
)
请使用preg_match_all获取此类索引,数组中的0个索引是匹配项,1个索引是标签名称,2个索引是标签值。 1 和 2 索引与您需要的键值的位置完全相同。
<?php
// This is my string
$input = "Lorum ipsum [tag=foo]dolor[/tag] sit [tag=bar]amet[/tag] consectetur adipiscing elit.";
// This is my pattern
$pattern = "~\[tag=(.*?)\](.*?)\[/tag\]~s";
// This should output all tags with it's value
preg_match_all($pattern, $input, $output);
print_r($output);
OUTPUT:
Array
(
[0] => Array
(
[0] => [tag=foo]dolor[/tag]
[1] => [tag=bar]amet[/tag]
)
[1] => Array
(
[0] => foo
[1] => bar
)
[2] => Array
(
[0] => dolor
[1] => amet
)
)