Php 如何将字符串转换为数组?
我想将此字符串转换为数组:Php 如何将字符串转换为数组?,php,arrays,Php,Arrays,我想将此字符串转换为数组: id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038 stat:DELIVRD err:000 text:New HTTP Test TxtN 在这种情况下,使用类似于explode(“,$string)的方法是无效的。因为文本可能很长 假设一个值可以包含多个单词的唯一位置是字符串的末尾(否则,在不知道键列表的情况下问题是无法解决的),可以使用以下正则表达
id:5918351498722606 sub:001 dlvrd:001 submit date:1410311037 done date:1410311038
stat:DELIVRD err:000 text:New HTTP Test TxtN
在这种情况下,使用类似于
explode(“,$string)
的方法是无效的。因为文本可能很长 假设一个值可以包含多个单词的唯一位置是字符串的末尾(否则,在不知道键列表的情况下问题是无法解决的),可以使用以下正则表达式查找所有key:value
对:
(?:^|\s+)([^:]+):([^:]+$|[^\s]+)
这是找
- 行的开头或一些空格
- 某些字符不是
:
- A
:
- 可以是后跟行尾的字符数,也可以是非空白字符数
输出:
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
假设一个值可以包含多个单词的唯一位置是字符串的末尾(否则,在不知道键列表的情况下问题是无法解决的),您可以使用以下正则表达式查找所有的键:值对:
(?:^|\s+)([^:]+):([^:]+$|[^\s]+)
这是找
- 行的开头或一些空格
- 某些字符不是
:
- A
:
- 可以是后跟行尾的字符数,也可以是非空白字符数
输出:
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
使用preg\u match\u all()
提取带有string:string(最多为空格)的段,您可以捕获诸如提交日期: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);
输出
使用preg\u match\u 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);
输出
在您的示例数据中,:
后面的值可能仅为数字、大写字符或带空格的单词。如果是这种情况,您可以使用以下任一情况的检查:
([^:]+):([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);
结果
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
在您的示例数据中,:
后面的值可能仅为数字、大写字符或带空格的单词。如果是这种情况,您可以使用以下任一情况的检查:
([^:]+):([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);
结果
Array
(
[id] => 5918351498722606
[sub] => 001
[dlvrd] => 001
[submit date] => 1410311037
[done date] => 1410311038
[stat] => DELIVRD
[err] => 000
[text] => New HTTP Test TxtN
)
好吧,那你期待什么呢?为什么爆炸是无效的?就我所知,它是有效的。@Nick@Andreas我期待类似于array('id'=>'5918351498722606')
的东西,当我使用explode时,它将从文本生成数组,我不想要它。好吧,你期望什么?为什么爆炸是无效的?据我所知,它是有效的。@Nick@Andreas我期待类似于array('id'=>'5918351498722606')
的东西,当我使用explode时,它会从text
生成数组,我不想要它。非常感谢,这是我想要的:)非常感谢,这是我想要的:)这很好,但是看看text
有新的。没别的了。你想要“新的HTTP测试TxtN”作为值吗?这很好,但是看看text
,只有新的。没有其他内容。您希望“New HTTP Test TxtN”作为值吗?尽管这依赖于黑客获取最后一个值,但它似乎是正确的解决方案。使用此答案并对其进行了一点更新。现在它检查输入的字符串是否正确。感谢您的回答。虽然这依赖于黑客获取最后一个值,但它似乎是正确的解决方案。使用此答案并对其进行了一点更新。现在它检查输入的字符串是否正确。谢谢你的回答。