3

PHP と Regex の初心者のようなものですが、Web サービスから次のメッセージを受け取ります。

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

上記の行は、3 回繰り返される 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

また

次のように爆発を使用して実行できます。

$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

関数expand()を使用する

<?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

言葉がどうなるか正確には覚えていませんが...

「問題があり、正規表現を使用することにしました...今は2つの問題があります。」

'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+) は、1 つ以上の数字がすべて必要であることを意味します

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 に答える
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 に答える