在循环问题中的Preg_match

时间:2011-08-05 08:01:17

标签: php logging preg-match

我正在尝试使用for循环对字符串数组执行preg_match,但它只返回数组中最终项的过滤结果。

这是我的代码:

<!-- language: lang-php -->

$file = "smalllog";
$handle = fopen($file, 'rb');   
if ($handle) {  
    $lines = array();
    $count = 0;
    while ( ($line = fgets($handle)) !== false) {
        if(strpbrk($line,"/tracking/p2x/")) {               
            $lines[$count]['string'] = $line;               
            $count++;
        }               
    }
    fclose($handle);    
}   
for($i=0;$i<count($lines);$i++) {   
    $matches = array(); 
    preg_match("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $lines[$i]['string'], $matches);
    print_r($matches);      
    print '<br /><br />';   
}

哪个应显示爆炸阵列列表。然而,我实际看到的看起来更像是这样:

Array()

Array()

Array ( !--correctly exploded data in here--! )

如果这是一个愚蠢的问题,我道歉 - 我的PHP技能不是很好。

编辑:以下是似乎已纠正此问题的更改:

更改正则表达式:

"/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/"

为:

"/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")/" 

(放弃$

3 个答案:

答案 0 :(得分:0)

$preg_match_all就是你想要的

$file = "smalllog";
$handle = fopen($file, 'rb');   
if ($handle) {  
    $lines = array();
    $count = 0;
    while ( ($line = fgets($handle)) !== false) {
        if(strpbrk($line,"/tracking/p2x/")) {               
            $lines[$count]['string'] = $line;               
            $count++;
        }               
    }
    fclose($handle);    
}   
for($i=0;$i<count($lines);$i++) {   
    $matches = array(); 
    preg_match_all("/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) (\".*?\") (\".*?\")$/", $lines[$i]['string'], $matches);
    print_r($matches);      
    print '<br /><br />';   
}

答案 1 :(得分:0)

你正在使用strpbrk()完全错误的strpbrk期望它的第二个参数是字符列表,你显然是在尝试用它来搜索一个字符串。使用 strpos()

答案 2 :(得分:0)

你的行末尾有\ n字符(最后一行除外),因为正常。*不匹配\ n你的模式不匹配。你需要使用DOTALL修饰符,在你的模式的末尾添加“s”(在分隔符之后)你应该没问题:

"/^(\S+) ... (\".*?\")$/s"