开发者

Preg_match inside a loop issue

开发者 https://www.devze.com 2023-03-25 06:47 出处:网络
I\'m trying to do a preg_match on an array of strings using a for loop but it\'s only returning the filtered result for the final item in the array.

I'm trying to do a preg_match on an array of strings using a for loop but it's only returning the filtered result for the final item in the array.

Here is my code:

<!-- language: lang-ph开发者_运维百科p -->

$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 />';   
}

Which should display a list of exploded arrays. However what i actually see looks more like this:

Array()

Array()

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

I apologize if this is a dumb question - my PHP skills are not great.

EDIT: Here is the change that seems to have corrected the issue:

Changing the regexp from:

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

to:

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

(dropped the $)


$preg_match_all is what you want

$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 />';   
}


You are using strpbrk() completely wrong strpbrk expects its second argument to be a character list, you are obviously trying to search for a string with it. Use strpos() for that.


You have \n character at the end of your lines (except the last line) and since normal .* doesn't match \n your pattern doesn't match. You need to use the DOTALL modifier, add "s" to the end of your pattern (after the delimiter) and you should be fine:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号