我想将此字符串转换为数组:
id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN
使用类似explode(" ", $string)
的方法在这种情况下无效。因为text
可能很长。
答案 0 :(得分:2)
假设一个值可以有多个单词的唯一位置是字符串的末尾(否则该问题在不知道键列表的情况下是无法解决的),则可以使用preg_match_all
查找所有{{1 }}使用此正则表达式进行配对:
key:value
这寻找
(?:^|\s+)([^:]+):([^:]+$|[^\s]+)
的字符:
:
输出:
$string = 'id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN';
preg_match_all('/(?:^|\s+)([^:]+):([^:]+$|[^\s]+)/', $string, $matches);
$output = array_combine($matches[1], $matches[2]);
print_r($output);
答案 1 :(得分:2)
使用preg_match_all()
提取带有string:string(最多为空格)的句段,将使您能够捕获类似submit date:1410311037
之类的东西。唯一的问题是末尾的文本中可能有空格。因此,为了解决这个问题,它专门提取了最终文本。
$string = 'id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN';
preg_match_all("/(.*?):(.*?)\s/", $string, $matches);
$matches[2][count($matches[2])-1] = trim(strrchr($string, ":"), ":");
$out = array_combine($matches[1], $matches[2]);
print_r($out);
输出...
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
答案 2 :(得分:0)
<?php
$string = "id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN";
$spF = explode(' ',$string);
$phpArray = array();
foreach($spF as $data){
$sp = explode(':',$data);
if(!empty($sp[0]) && !empty($sp[1])){
$phpArray[$sp[0]] = $sp[1];
}
}
var_dump($phpArray);
?>
答案 3 :(得分:0)
在您的示例数据中,:
之后的值似乎仅是数字,仅是大写字符或带空格的单词。如果是这种情况,您可以使用alternation检查以下两种情况之一:
([^:]+):([A-Z]{2,}|\d+|\w+(?: \w+)*)
这将匹配:
([^:]+)
使用否定的字符类以1次以上的次数捕获:
,而不是:
(
字面上匹配[A-Z]{2,}
捕获组
|
2次或多次大写字母\d+
或|
匹配1个以上的数字\w+(?: \w+)*
或)
或1+倍的单词字符,然后是一个与空格匹配的重复组,再加上1+倍的单词字符$str = "id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN";
$pattern = '/([^:]+):([A-Z]{2,}|\d+|\w+(?: \w+)*)/';
preg_match_all($pattern, $str, $matches);
$res = array_combine((array_map("trim", $matches[1])), $matches[2]);
print_r($res);
关闭捕获组请参见regex demo | Php demo
例如:
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
结果
overflow-x: hidden