如何从输入字符串创建包含键值对的数组的数组?

时间:2018-09-27 10:09:58

标签: php regex multidimensional-array key-value preg-split

我正在用php开发搜索栏,但无法编写可以满足我要求的正则表达式。

我有一个像这样的输入字符串:

$text = "key1=value 1 key2=value 2 key3=val 3";

我希望能够分解成具有以下结构的多维数组:

$array = [["key1", "value 1"], ["key2", "value 2"], ["key3", "val 3"]];

这怎么用ph​​p中的正则表达式模式完成?

3 个答案:

答案 0 :(得分:0)

免责声明:这不是正则表达式,但可以解决问题。

假设每个键/值对之间只有一个空格,则应该这样做

function keySplit($pair) {
    return explode("=", $pair, 2);
}

$array = array_map("keySplit", explode(" ", $text));

如果两对之间用&隔开,则只需将explode函数中的空格替换为&

答案 1 :(得分:0)

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}


function str_to_keyvalue($text, $separator="="){
    $array_keyword=array();
    if(strpos($text, $separator)>0){
        $re = '/(\w+)'.$separator.'/';
        preg_match_all($re, $text, $matches, PREG_SET_ORDER, 0);
        for($b=0; $b<count($matches); $b++){
            $tmpArray=array();
            if($b==count($matches)-1){
                $beginPos=stripos($text, $matches[$b][0])+strlen($matches[$b][0]);
                $endPos=strlen($text)-$beginPos;
                array_push($tmpArray, $matches[$b][1],  trim(substr($text, $beginPos, $endPos)));
            }else{
                array_push($tmpArray,$matches[$b][1], trim(get_string_between($text, $matches[$b][0], $matches[$b+1][0])));
            }
            array_push($array_keyword, $tmpArray);
        }
    }else{
        array_push($array_keyword, $text);
    }
    return $array_keyword;
}

答案 2 :(得分:0)

有两种方法可以使用preg_split() ...生成所需的键值对多维数组...

Demo

方法1:=或空格上分割,后跟1个或多个单词字符,然后是=

var_export(array_chunk(preg_split('~=| (?=\w+=)~', $text), 2));

方法2:在每个键上分开,在匹配中包含前导和训练字符,仅保留键和值

var_export(array_chunk(preg_split('~ ?(\w+)=~', $text, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE), 2));

输出:(从任一方向输出)

array (
  0 => 
  array (
    0 => 'key1',
    1 => 'value 1',
  ),
  1 => 
  array (
    0 => 'key2',
    1 => 'value 2',
  ),
  2 => 
  array (
    0 => 'key3',
    1 => 'val 3',
  ),
)

preg_split()只能返回一维数组(在这种情况下,keyvalkeyval等),因此array_chunk()用于生成所需的每个子数组两个元素。