在PHP中将数字序列转换为数组

3

我在PHP和正则表达式方面有点新手,我从Web服务中收到以下内容:

test:002005@1111@333333@;10205@2000@666666@;002005@1111@55555@;

上述行是一个由3个数字组成的序列,该序列重复3次。我想获取每个序列的第3个数字,并且我认为最好的方法(除了3000个爆炸)是使用preg_match_all,但我很难理解正则表达式。

最终结果应如下所示:

 Array
    (
        [0] => 333333
        [1] => 666666
        [2] => 55555
    )

感谢您提前提供的任何帮助。
5个回答

5
if(preg_match_all('/.*?(?:\d+@){2}(\d+)@;/',$s,$m)) {
        print_r($m[1]);
}

http://ideone.com/99M9t

或者

你可以使用explode函数实现:

$input = rtrim($input,';');
$temp1 = explode(';',$input);
foreach($temp1 as $val1) {
        $temp2 = explode('@',$val1);
        $result[] = $temp2[2];
}
print_r($result);

http://ideone.com/VH29g


非常感谢,这解决了问题。我喜欢这个方法,因为它明确指出需要的那个"@XXXX"之前有两个。干得好! - Xander

2
使用函数explode()
<?php

$pizza  = "piece1@piece2@piece3@piece4@piece5@piece6";
$pieces = explode("@", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

?>

他要求一个没有explode函数的版本,我猜他的输入非常大,他想要一个快速/可扩展的解决方案。(目前我无法对任何方法的运行时间做出评论。) - TaZ
@Taz:他要求一个没有3000个爆炸的版本,我只看到了1个。我认为这很好地满足了他的要求。虽然这并没有得到他要求的输出... - Kris
我认为他需要另一个explode来获取每个$piece中的第三个项目。该explode将在循环中,以便您获得n + 1个explode调用。 - TaZ

0
你可以使用 preg_match_all 来完成这个任务,这会让任务变得非常简单:
$a = "test:002005@1111@333333@;10205@2000@666666@;002005@1111@55555@;";

preg_match_all('/@(\d+)@;/', $a, $m);

print_r($m);

$m[1] 包含你想要的输出。

参考:http://php.net/manual/zh/function.preg-match-all.php


0
我不记得确切的说法,但是...
“你有一个问题,决定使用正则表达式...现在你有两个问题。”
如果我们假设“test:”不是要解析的实际字符串的一部分,那么您的问题可以很容易地解决。
<?php

$in = '002005@1111@333333@;10205@2000@666666@;002005@1111@55555@;';

function splitGroupsAndGetColumn($input, $groupSeparator, $columnSeparator, $columnIndex, $skipEmpty=true)
{
    $result = array();

    $groups = explode($groupSeparator, $input);
    foreach($groups as $group)
    {
        $columns = explode($columnSeparator, $group);
        if (isset($columns[$columnIndex]))
        {
            array_push($result, $columns[$columnIndex]);
        }
        else if (! $skipEmpty)
        {
            array_push($result, NULL);
        }
    }

    return $result;
}

var_dump(splitGroupsAndGetColumn($in, ';', '@', 2));

输出:

array(3) {
  [0]=>
  string(6) "333333"
  [1]=>
  string(6) "666666"
  [2]=>
  string(5) "55555"
}

这句话肯定是来自一个不了解正则表达式的人;-) ... 至少,我想知道是什么让某些人认为循环比正则表达式在这样一个简单的任务中更好呢? - aurora
我不知道,但我喜欢正则表达式,几乎和原始说法一样。在我看来,正则表达式很好,但不应该像传统的锤子一样使用。 - Kris
我在一些书籍中看到了一个用于验证跨越多个页面的电子邮件地址的正则表达式。我认为这将是一个我同意你的情况 :-) - aurora
@harald:没错。/([b]{2}|[^b]{2})/ - Kris
@YagoRiveiro:确实。如果你问我,这样做更易读无穷多倍。 - Kris
显示剩余2条评论

0

我的版本 :)

正则表达式 (\d+) 的含义是我想要所有的一个或多个数字

php > $a = '002005@1111@333333@;10205@2000@666666@;002005@1111@55555@';
php > preg_match_all('/(\d+)/',$a,$matches);
php > var_dump($matches);
array(2) {
  [0]=>
  array(9) {
    [0]=>
    string(6) "002005"
    [1]=>
    string(4) "1111"
    [2]=>
    string(6) "333333"
    [3]=>
    string(5) "10205"
    [4]=>
    string(4) "2000"
    [5]=>
    string(6) "666666"
    [6]=>
    string(6) "002005"
    [7]=>
    string(4) "1111"
    [8]=>
    string(5) "55555"
  }
  [1]=>
  array(9) {
    [0]=>
    string(6) "002005"
    [1]=>
    string(4) "1111"
    [2]=>
    string(6) "333333"
    [3]=>
    string(5) "10205"
    [4]=>
    string(4) "2000"
    [5]=>
    string(6) "666666"
    [6]=>
    string(6) "002005"
    [7]=>
    string(4) "1111"
    [8]=>
    string(5) "55555"
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接