使用preg_split获取关联数组


Get associative array using preg_split

我的以下正则表达式有两个问题:

1) 输出在开头和结尾显示了2个额外的(空白)元素(不能使用PREG_SPLIT_NO_EMPTY,因为isbn可以为空)。

2) 有可能从中获得关联数组吗?我的意思是,我想要这种格式的$output=数组形式的输出("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, ',"$1":"$2"', $val), 1).'}');

顺便说一句,这个查找每个[TAG]并将其放入数组中(无论您使用多少标签)。请注意,由于它使用JSON,它可能会遇到"问题,或者意外的字符串不在[tag]string[/tag]模式中。