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”作为值吗?尽管这依赖于黑客获取最后一个值,但它似乎是正确的解决方案。使用此答案并对其进行了一点更新。现在它检查输入的字符串是否正确。感谢您的回答。虽然这依赖于黑客获取最后一个值,但它似乎是正确的解决方案。使用此答案并对其进行了一点更新。现在它检查输入的字符串是否正确。谢谢你的回答。