Как создать массив массивов, содержащих пары ключ-значение из входной строки? - PullRequest
0 голосов
/ 27 сентября 2018

Я разрабатываю панель поиска в php, но не могу написать выражение регулярного выражения, которое может сделать то, что мне нужно.

У меня есть строка ввода, подобная этой:

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

Я хотел бы иметь возможность разбить на многомерный массив с этой структурой:

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

Как это можно сделать с помощью шаблона регулярных выражений в php?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018
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;
}
0 голосов
/ 02 октября 2018

Вот два способа сгенерировать нужный многомерный массив пар ключ-значение с помощью 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() может возвращать только одномерный массив (в данном случае key, val, key, val, ...), поэтому array_chunk() используется для генерации желаемой структуры из двух элементов на подмассив.

0 голосов
/ 27 сентября 2018

Отказ от ответственности : Это не регулярное выражение, но решает проблему.

Если только каждая пара ключ / значение разделяет пробел, это должно быть сделано

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

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

Если пары разделены &, просто замените пробел в функции explode на &.

...