使用 preg_split 获取关联数组
Get associative array using preg_split
我的以下正则表达式有 2 个问题:
1) 输出在开头和结尾显示了 2 个额外的(空白)元素(不能使用 PREG_SPLIT_NO_EMPTY,因为 isbn 可以为空)。
2) 是否可以从中获取关联数组?我的意思是我想要 $output = array("title" => "Book1", "writer" => "writer1", "isbn" => "1234" ) 这种格式。
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$pattern = '/\[title](.*?)\[\/title].*?\[writer](.*?)\[\/writer].*?\[isbn](.*?)\[\/isbn]/i';
$allparams = preg_split($pattern, $val, -1, PREG_SPLIT_DELIM_CAPTURE);
输出:
Array ( [0] => [1] => Book1 [2] => Writer1 [3] => 1234 [4] => )
preg_split
不是要走的路,请使用 preg_match
(如果您想从一个字符串中获得多个结果,则使用 preg_match_all
):
$pattern = '~
\[title] (?<title> [^[]+ ) \[/title] .*?
\[writer] (?<writer> [^[]+ ) \[/writer] .*?
\[isbn] (?<isbn> [^[]+ ) \[/isbn]
~sx';
if (preg_match($pattern, $yourtext, $m)) {
echo 'title: ' . $m['title'] . PHP_EOL
. 'writer: ' . $m['writer'] . PHP_EOL
. 'isbn: ' . $m['isbn'] . PHP_EOL;
}
s
标志允许点匹配换行符,x
标志忽略模式中的空格。
请注意,从 PHP 5.6 开始,您可以像这样过滤数字键(未测试):
$result = array_filter($m, function ($k) { return !is_numeric($k); }, ARRAY_FILTER_USE_KEY);
如果您没有 PHP >= 5.6,一个简单的 foreach
循环就可以完成这项工作:
$result = array();
foreach ($m as $k=>$v) {
if (is_numeric($k) || empty($v)) continue;
$result[$k] = $v;
}
类似的方法就可以了,即使这不是我认为的最佳方式...
$a = "/\[(.*)\](.*)\[\/.*\]/U";
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$array = json_decode('{'.substr(preg_replace($a, ',"":""', $val), 1).'}');
顺便说一句,这个找到每个 [TAG]
并将其放入数组中(无论您使用多少标签)。
小心,因为它使用 JSON,它可能有一些问题 "
或不在 [tag]string[/tag]
模式中的意外字符串。
我的以下正则表达式有 2 个问题:
1) 输出在开头和结尾显示了 2 个额外的(空白)元素(不能使用 PREG_SPLIT_NO_EMPTY,因为 isbn 可以为空)。
2) 是否可以从中获取关联数组?我的意思是我想要 $output = array("title" => "Book1", "writer" => "writer1", "isbn" => "1234" ) 这种格式。
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$pattern = '/\[title](.*?)\[\/title].*?\[writer](.*?)\[\/writer].*?\[isbn](.*?)\[\/isbn]/i';
$allparams = preg_split($pattern, $val, -1, PREG_SPLIT_DELIM_CAPTURE);
输出:
Array ( [0] => [1] => Book1 [2] => Writer1 [3] => 1234 [4] => )
preg_split
不是要走的路,请使用 preg_match
(如果您想从一个字符串中获得多个结果,则使用 preg_match_all
):
$pattern = '~
\[title] (?<title> [^[]+ ) \[/title] .*?
\[writer] (?<writer> [^[]+ ) \[/writer] .*?
\[isbn] (?<isbn> [^[]+ ) \[/isbn]
~sx';
if (preg_match($pattern, $yourtext, $m)) {
echo 'title: ' . $m['title'] . PHP_EOL
. 'writer: ' . $m['writer'] . PHP_EOL
. 'isbn: ' . $m['isbn'] . PHP_EOL;
}
s
标志允许点匹配换行符,x
标志忽略模式中的空格。
请注意,从 PHP 5.6 开始,您可以像这样过滤数字键(未测试):
$result = array_filter($m, function ($k) { return !is_numeric($k); }, ARRAY_FILTER_USE_KEY);
如果您没有 PHP >= 5.6,一个简单的 foreach
循环就可以完成这项工作:
$result = array();
foreach ($m as $k=>$v) {
if (is_numeric($k) || empty($v)) continue;
$result[$k] = $v;
}
类似的方法就可以了,即使这不是我认为的最佳方式...
$a = "/\[(.*)\](.*)\[\/.*\]/U";
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$array = json_decode('{'.substr(preg_replace($a, ',"":""', $val), 1).'}');
顺便说一句,这个找到每个 [TAG]
并将其放入数组中(无论您使用多少标签)。
小心,因为它使用 JSON,它可能有一些问题 "
或不在 [tag]string[/tag]
模式中的意外字符串。