如何将TxtNation字符串转换为数组?

时间:2018-12-28 12:26:06

标签: 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)的方法在这种情况下无效。因为text可能很长。

4 个答案:

答案 0 :(得分:2)

假设一个值可以有多个单词的唯一位置是字符串的末尾(否则该问题在不知道键列表的情况下是无法解决的),则可以使用preg_match_all查找所有{{1 }}使用此正则表达式进行配对:

key:value

这寻找

  • 行首或某些空格
  • 一些不是(?:^|\s+)([^:]+):([^:]+$|[^\s]+) 的字符
  • 一个:
  • 或者一定数量的字符后跟行尾,或者一定数量的非空白字符

Demo on regex101

:

输出:

$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);

Demo on 3v4l.org

答案 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);


?>

enter image description here

答案 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