3

有点像 PHP 和 Regex 的菜鸟,我从 Web 服务收到以下内容:

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

上面的行是重复 3 次的 3 个数字的序列。我想获得每个序列的第三个数字,我相信最好的课程(除了 3000 次爆炸)将是 preg_match_all,但我很难将注意力集中在 RegEx 上。

最终结果应如下所示:

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

提前感谢您的帮助。

4

5 回答 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

于 2012-05-10T11:16:52.723 回答
2

使用函数explode()

<?php

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

?>
于 2012-05-10T11:17:04.750 回答
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/en/function.preg-match-all.php

于 2012-05-10T11:16:43.490 回答
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"
}
于 2012-05-10T11:21:47.960 回答
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"
  }
}
于 2012-05-10T14:46:01.910 回答