我正在用php开发搜索栏,但无法编写可以满足我要求的正则表达式。
我有一个像这样的输入字符串:
$text = "key1=value 1 key2=value 2 key3=val 3";
我希望能够分解成具有以下结构的多维数组:
$array = [["key1", "value 1"], ["key2", "value 2"], ["key3", "val 3"]];
这怎么用php中的正则表达式模式完成?
答案 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()
只能返回一维数组(在这种情况下,key
,val
,key
,val
等),因此array_chunk()
用于生成所需的每个子数组两个元素。