在PHP中将数字序列转换为数组
在PHP和Regex中,我有点无所事事,我从一个web服务接收到以下信息:在PHP中将数字序列转换为数组,php,regex,arrays,string,preg-match-all,Php,Regex,Arrays,String,Preg Match All,在PHP和Regex中,我有点无所事事,我从一个web服务接收到以下信息: test:002005@1111@333333@;10205@2000@666666@;002005@1111@55555@; 上面这一行是由3个数字组成的序列,重复3次。我想得到每个序列的第三个数字,我相信最好的课程(除了3000次爆炸)是preg_match_,但我很难将我的思想集中在正则表达式上 最终结果应如下所示: Array ( [0] => 333333 [1
test:002005@1111@333333@;10205@2000@666666@;002005@1111@55555@;
上面这一行是由3个数字组成的序列,重复3次。我想得到每个序列的第三个数字,我相信最好的课程(除了3000次爆炸)是preg_match_,但我很难将我的思想集中在正则表达式上
最终结果应如下所示:
Array
(
[0] => 333333
[1] => 666666
[2] => 55555
)
提前感谢您的帮助。您可以使用
preg\u match\u all
完成此任务,这使任务非常简单:
$a = "test:002005@1111@333333@;10205@2000@666666@;002005@1111@55555@;";
preg_match_all('/@(\d+)@;/', $a, $m);
print_r($m);
$m[1]包含所需的输出
参考:
或
可以使用“分解为”进行此操作:
$input = rtrim($input,';');
$temp1 = explode(';',$input);
foreach($temp1 as $val1) {
$temp2 = explode('@',$val1);
$result[] = $temp2[2];
}
print_r($result);
使用该功能
我记不清这句话到底是怎么说的,但是 “您遇到了一个问题,决定使用正则表达式……现在有两个问题。” 如果我们假设“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));
我的版本:)
正则表达式(\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"
}
}
他要求一个没有爆炸的版本,我认为他的投入很大,他想要一个快速/可扩展的解决方案。(我现在不能说任何一种方法的运行时间。)@Taz:他要求一个没有3000次爆炸的版本,我只看到1次。我认为这很好地满足了这一要求。虽然这实际上没有得到他要求的输出…我相信他需要另一次爆炸来获得每个
$piece
中的第三项。这个explode将在一个循环中,因此您将得到n+1explode
调用。这句话一定来自不懂正则表达式的人;-)。。。至少:我想知道是什么让人认为循环比正则表达式更适合这样一个简单的任务?我不知道,但我几乎和最初的说法一样喜欢正则表达式。正则表达式很好,但不能像众所周知的锤子那样使用。我在一些书中见过一个正则表达式,用于验证跨越几页的电子邮件地址。我想在这种情况下我会同意你的意见:-)@harald:没错/([b]{2}|[^b]{2})/@YagoRiveiro:的确如此。如果你问我的话,也会有无限的可读性。非常感谢,这就成功了。我喜欢这个,因为它定义了一个事实,即在需要的一个之前有两个“@XXXX”。干得好!
<?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"
}
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"
}
}