我从服务器得到这个回复:
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235 OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692
依旧......
这只是一个长字符串,没有回车符我完全按照收到的方式复制了它。 请注意,初始OK可以是不同的单词,0(在字符串的开头)可以是最多3位数字。
这是重复的模式:
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235
我想把它变成一个看起来像这样的数组:
Array
(
[0] => Array
[1] => OK
[2] => 0
[3] => e3674786a1c5f7a1
[4] => 6162865783958235
[1] => Array
[1] => OK
[2] => 0
[3] => 9589936487b8d0a1
[4] => 6141138716371692
)
你会怎么做?感谢您的投入。
答案 0 :(得分:1)
考虑到您将该数据作为字符串输入:
$str = <<<STR
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235
OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692
STR;
解决方案是explode
将字符串分成不同的行:
$lines = explode("\n", $str);
在评论和编辑OP后编辑
考虑到你收到的数据只有一行,你必须找到另一种方法来分割它(我认为分割数据和处理大量数据的“线”更容易。
考虑到您收到的数据如下所示:
$str = <<<STR
OK: 0; Sent queued message ID: e3674786a1c5f7a1 SMSGlobalMsgID:6162865783958235 OK: 0; Sent queued message ID: 9589936487b8d0a1 SMSGlobalMsgID:6141138716371692
STR;
我想你可以用preg_split
将其分成“行”,使用正则表达式如下:
$lines = preg_split('/SMSGlobalMsgID: (\d+) /', $str);
如果你试图输出$lines
的内容,看起来很好 - 你现在应该可以迭代这些行了。
然后,首先将$output
数组初始化为空数组:
$output = array();
而且你现在必须循环初始输入的行,在每一行使用一些正则表达式魔法:
有关更多信息,请参阅preg_match
和Regular Expressions (Perl-Compatible)
的文档
foreach ($lines as $line) {
if (preg_match('/^(\w+): (\d+); Sent queued message ID: ([a-z0-9]+) SMSGlobalMsgID:(\d+)$/', trim($line), $m)) {
$output[] = array_slice($m, 1);
}
}
使用()
最后,您将获得$output
数组:
var_dump($output);
看起来像这样:
array
0 =>
array
0 => string 'OK' (length=2)
1 => string '0' (length=1)
2 => string 'e3674786a1c5f7a1' (length=16)
3 => string '6162865783958235' (length=16)
1 =>
array
0 => string 'OK' (length=2)
1 => string '0' (length=1)
2 => string '9589936487b8d0a1' (length=16)
3 => string '6141138716371692' (length=16)