2014-06-16 74 views
0

我有以下通过从函数中获取数组逐行返回。PHP的正则表达式解析行

[1mSlot别名UpRate DnRate的MinAct
[4M /标识链接链接
[0米1/1 113822003 0 0 1 1/1,1/2,1/5,2/1,
3/1,3/2,4/1,4/2

1/3 432144003 0 0 1 1/3,3/3
1/4 128447003 0 0 1 1/4,3/4
1/6 123458003 0 0 1 1/6,2/5,4/8,6/6,
6/25
1/9 123445003 0 0 1 1/9,1/31,2/18,3/9,
5/8,6/22,6/23,6/24,
6/26,7/8,7/11,7/13,
7/14,8/6,8/7, 8/8,
8/11,8/22,9/11,9/12

我有在http://www.regexr.com/工作,但不要在PHP一切工作的正则表达式如下表现如预期似乎。特别是EfmLinkRegex,负向前视功能不适用。前三个我使用preg_match()链接一个我使用preg_match_all()。我使用

$OrderRegex = '([0-9]{4,7}003)'; 
$GroupRegex = '(^[0-9]{1,2}\/[0-9]{1,2})'; 
$LinkRegex = '/(?!^[0-9]{1,2}\/[0-9]{1,2})([0-9]{1,2}\/[0-9]{1,2})/'; 

当前代码:

foreach ($Data as $row) 
{ 
    preg_match($OrderRegex, $row, $OrderMatches); 
    preg_match($GroupRegex, $row, $GroupMatches); 
    preg_match_all($LinkRegex, $row, $LinkMatches); 
} 

我在我的示例输入的3行运行在上面是第一“1/1”值是通过“[0米”开头否定正则表达式(目前不起作用)。我还需要一种方法在没有匹配订单的行中添加链接,以将其分配给该订单。

例如最终结果是:

Order: 113822003 
Group: 1/1 
Links: 1/1, 1/2, 1/5, 2/1, 3/1, 3/2, 4/1, 4/2 

Order: 432144003 
Group: 1/3 
Links: 1/3, 3/3 

Order: 128447003 
Group: 1/4 
Links: 1/4, 3/4 

etc, etc, etc, 

例如最终结果作为数组:

阵列([组] =>数组([0] => 1/1)[订购] =>数组( [0] => 113822003)[链接] =>数组([0] => 1/1 [1] => 1/2 [2] => 1/5 [3] => 2/1 [4] = > 3/1 [5] => 3/2 [6] => 4/1 [7] => 4/2))

我知道最有可能的东西很简单我很想念这里,但它是逃避我。如果我可以匹配“组”减去^,只要它以某种方式在顺序之前,那么只需将它添加到链接数组中?

编辑: 发现通过“$ row = substr($ row,1,strlen($ row));”传递每个$行似乎已经解决了我的问题与Group和Link正则表达式字符串拉动正确的匹配,我猜不知有些字符串的开头有不可见的字符,不允许正则表达式中字符串指示符的开始正常工作。

所以现在我只需要弄清楚如何让这个不包含“秩序”的任何行添加链接到上一行的链接匹配

+0

代替我不是承担你正在寻找的输出。你可以为你想要的输出粘贴某种阵列吗?你会乐意用一个正则表达式来完成吗?它是否必须一行一行? – zx81

+0

PHP的preg_ *函数需要分隔符,例如/.../或〜...〜。在第一种和第二种情况下,我认为它是以()作为分隔符。在'引号内添加〜分隔符。 –

+0

是的,它必须是逐行的(或者更具体地说,每一行都是一个名为“$ Data”的数组中的一个入口,所以我通过入口解析出它),这就是telnet类返回读取行的方式从路由器。向其他两个添加/.../对回报没有帮助。 – James

回答

0

我建议你在两个步骤去做。
步骤1:
使用此模式^.*?(?=\d+\/\d+)|(,)\v|(\v)\v+|(003)(?: \d+){3}使用gs选项并替换w/$1$2$3进行清理。
Demo

结果将看起来像这样

1/1 1/1 113822003,1/2,1/5,2/1,3/1,3/2,4/1, 4/2
1/3 432144003 1/3,3/3
1/4 128447003 1/4,3/4
1/6 123458003 1/6,2/5,4/8,6/6 ,6/25
1/9 123445003 1/9,1/31,2/18,3/9,5/8,6/22,6/23,6/24,6/26,7/8, 7/11,7/13,7/14,8/6,8/8,8/8,8/8,8/22,9/11,9/12

第2步:
现在是很容易执行另一个正则表达式,并与gm选项得到你想要的最终结果,像这样
使用这种模式^(\d+\/\d+)\s*(\d{9})\s*([, \/0-9]+)Order: $2\nGroup: $1\nLinks: $3\n
Demo

+0

我希望我能用Regex做到这一点,非常感谢你,这些让我得到了我需要的答案。一个问题,你认为最有效的方法来做第一步会是因为每行是一个数组中的一个条目? – James

+0

我不知道PHP,但我会想象你使用“for”循环遍历每个数组值并在其上应用RegEx。 –