将PHP字符串拆分为数组

时间:2016-09-05 12:10:06

标签: php api

我有一个来自API的字符串,需要将其放入一个数组中才能使用它,但我找不到任何解决方案。我希望有人可以提供帮助。

字符串如下所示:

 domain: xxx.de native_domain: xxx.de user: master status: active
transfer_lock: yes auto_renew: yes delegation: yes ownerc: ASDASD1
adminc: ASDASD1 techc: ASDASD1 billc: FLOSCH2 created: 2015-08-25
10:31:08 modified: 2016-08-20 16:20:15 expire: 2017-08-25 10:31:13
chreseller_auth: dom-cdmv-zs0f-mpwg auth_info: dns::1/hostname:
dns1.xxx.com dns::1/hostip: dns::2/hostname: dns2.xxx.com
dns::2/hostip: dns::3/hostname: dns::3/hostip: dns::4/hostname:
dns::4/hostip: dns::5/hostname: dns::5/hostip: comment: inserted:
2016-01-29 23:46:29  

像这样的完整字符串

domain: xxx.de native_domain: xxx.de user: master status: active
transfer_lock: yes auto_renew: yes delegation: yes ownerc: ASDASD1
adminc: ASDASD1 techc: ASDASD1 billc: FLOSCH2 created: 2015-08-25
10:31:08 modified: 2016-08-20 16:20:15 expire: 2017-08-25 10:31:13
chreseller_auth: dom-cdmv-zs0f-mpwg auth_info: xxxxx_authinfo  
dns::1/hostname:
dns1.xxx.com dns::1/hostip: 1.1.1.1 dns::2/hostname: dns2.xxx.com
dns::2/hostip: 1.1.1.1 dns::3/hostname: dns3.xxx.com 
dns::3/hostip: 1.1.1.1 dns::4/hostname: dns4.xxx.com
dns::4/hostip: 1.1.1.1 dns::5/hostname: dns5.xxx.com dns::5/hostip: 
1.1.1.1 comment: comments inserted:
2016-01-29 23:46:29 

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我的解决方案(将其发布到phpfiddle):

$text = "domain: xxx.de native_domain: xxx.de user: master status: active transfer_lock: yes auto_renew: yes delegation: yes ownerc: ASDASD1 adminc: ASDASD1 techc: ASDASD1 billc: FLOSCH2 created: 2015-08-25 10:31:08 modified: 2016-08-20 16:20:15 expire: 2017-08-25 10:31:13 chreseller_auth: dom-cdmv-zs0f-mpwg auth_info: dns::1/hostname: dns1.xxx.com dns::1/hostip: 1.1.1.1 dns::2/hostname: dns2.xxx.com dns::2/hostip: 1.1.1.1 dns::3/hostname: dns::3/hostip: dns::4/hostname: dns::4/hostip: dns::5/hostname: dns::5/hostip: comment: xxx inserted: 2016-01-29 23:46:29";

preg_match_all("/\S+/", $text, $matches);

$array = array();


foreach ($matches[0] as $match)
{
    if (preg_match("/:$/", $match))
    {
        $current_key = $match;
        $array[$current_key] = "";
        continue;
    }
    else
    {
        $array[$current_key] .= ($array[$current_key] == "") ? $match : " $match";
    }


}

echo "<pre>"; print_r($array); echo "</pre>";

所以会发生的事情是我得到的所有东西都不是空间,这意味着我得到了&#34;域:&#34;,&#34; xxx.de&#34;等等。

对于每个捕获的组,我检查它是否以:结束,如果是,则它是密钥,如果没有,则将其与密钥一起保存到字典中。

不确定格式是否是您想要的格式,但我认为您应该可以从这里处理它。

PS:如果您愿意,可以更改文本内容。

答案 1 :(得分:0)

以下是您可以解决的问题,假设响应是一个完整的字符串,每个响应中具有相同的术语,您有一个预先定义的'needle'数组可以查看并且它会分离字符串在两根针之间进入自己的阵列。在这种情况下,两个针是要查找的两个术语,例如'domain:'和'native_domain:'。

<?php

$responseStr = "domain: xxx.de native_domain: xxx.de user: master status: active transfer_lock: yes auto_renew: yes delegation: yes ownerc: ASDASD1 adminc: ASDASD1 techc: ASDASD1 billc: FLOSCH2 created: 2015-08-25 10:31:08 modified: 2016-08-20 16:20:15 expire: 2017-08-25 10:31:13 chreseller_auth: dom-cdmv-zs0f-mpwg auth_info: dns::1/hostname: dns1.xxx.com dns::1/hostip: dns::2/hostname: dns2.xxx.com dns::2/hostip: dns::3/hostname: dns::3/hostip: dns::4/hostname: dns::4/hostip: dns::5/hostname: dns::5/hostip: comment: inserted: 2016-01-29 23:46:29";

$responseArray = [
    'domain:',
    'native_domain:',
    'user:',
    'status:',
    'transfer_lock:',
    'auto_renew:',
    'delegation:',
    'ownerc:',
    'adminc:',
    'techc:',
    'billc:',
    'created:',
    'modified:',
    'expire:',
    'chreseller_auth:',
    'auth_info:',
    'dns::1/hostname:',
    'dns::1/hostip:',
    'dns::2/hostname:',
    'dns::2/hostip:',
    'dns::3/hostname:',
    'dns::3/hostip:',
    'dns::4/hostname:',
    'dns::4/hostip:',
    'dns::5/hostname:',
    'dns::5/hostip:',
    'comment:',
    'inserted:',
    "\r"
];


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

for ($i = 0; $i < sizeof($responseArray) - 1; $i++) {
    $finalArr[$responseArray[$i]] = trim(get_string_between($responseStr, $responseArray[$i], $responseArray[$i+1]));
}
?>

<pre>
<?php var_dump($finalArr); ?>
</pre>

这将提供以下输出;

array(28) {
  ["domain:"]=>
  string(6) "xxx.de"
  ["native_domain:"]=>
  string(6) "xxx.de"
  ["user:"]=>
  string(6) "master"
  ["status:"]=>
  string(6) "active"
  ["transfer_lock:"]=>
  string(3) "yes"
  ["auto_renew:"]=>
  string(3) "yes"
  ["delegation:"]=>
  string(3) "yes"
  ["ownerc:"]=>
  string(7) "ASDASD1"
  ["adminc:"]=>
  string(7) "ASDASD1"
  ["techc:"]=>
  string(7) "ASDASD1"
  ["billc:"]=>
  string(7) "FLOSCH2"
  ["created:"]=>
  string(19) "2015-08-25 10:31:08"
  ["modified:"]=>
  string(19) "2016-08-20 16:20:15"
  ["expire:"]=>
  string(19) "2017-08-25 10:31:13"
  ["chreseller_auth:"]=>
  string(18) "dom-cdmv-zs0f-mpwg"
  ["auth_info:"]=>
  string(0) ""
  ["dns::1/hostname:"]=>
  string(12) "dns1.xxx.com"
  ["dns::1/hostip:"]=>
  string(0) ""
  ["dns::2/hostname:"]=>
  string(12) "dns2.xxx.com"
  ["dns::2/hostip:"]=>
  string(0) ""
  ["dns::3/hostname:"]=>
  string(0) ""
  ["dns::3/hostip:"]=>
  string(0) ""
  ["dns::4/hostname:"]=>
  string(0) ""
  ["dns::4/hostip:"]=>
  string(0) ""
  ["dns::5/hostname:"]=>
  string(0) ""
  ["dns::5/hostip:"]=>
  string(0) ""
  ["comment:"]=>
  string(0) ""
  ["inserted:"]=>
  string(0) ""
}