使用preg_split获取关联数组

时间:2015-11-13 20:38:19

标签: php regex preg-split

我的下面的正则表达式有2个问题:

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

2)是否可以从中获取关联数组?我的意思是我希望输出形式为$ output = array(" title" =>" Book1"," writer" =>" writer1& #34;," 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] => )

2 个答案:

答案 0 :(得分:2)

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&gt; = 5.6,一个简单的foreach循环可以完成这项工作:

$result = array();
foreach ($m as $k=>$v) {
    if (is_numeric($k) || empty($v)) continue;
    $result[$k] = $v;
}

答案 1 :(得分:1)

即使这不是我认为最好的方式,

类似的东西也可以做到这一点......

$a = "/\[(.*)\](.*)\[\/.*\]/U";
$val = "[title]Book1[/title][writer]Writer1[/writer][isbn]1234[/isbn]";
$array = json_decode('{'.substr(preg_replace($a, ',"$1":"$2"', $val), 1).'}');

BTW,这个找到每个[TAG]并将它放在数组中(每当你使用多少个标签时)。 请注意,因为它使用JSON,"[tag]string[/tag]模式中的意外字符串可能存在问题。