Preg_match внутри проблемы цикла - PullRequest
0 голосов
/ 05 августа 2011

Я пытаюсь сделать preg_match для массива строк, используя цикл for, но он возвращает только отфильтрованный результат для последнего элемента в массиве.

Вот мой код:

<!-- 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 голосов
/ 05 августа 2011

Вы используете strpbrk () совершенно неправильно strpbrk ожидает, что его второй аргумент будет список символов , вы, очевидно, пытаетесь найти строку сЭто.Для этого используйте strpos () .

0 голосов
/ 05 августа 2011

У вас есть символ \ n в конце ваших строк (кроме последней строки), и, поскольку обычно. * Не совпадает, \ n ваш шаблон не совпадает. Вам нужно использовать модификатор DOTALL, добавить «s» в конец вашего паттерна (после разделителя), и все должно быть в порядке:

"/^(\S+) ... (\".*?\")$/s"
0 голосов
/ 05 августа 2011

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