Строка - Как получить содержимое в первом наборе кавычек и поместить в массив

Я хочу извлечь текст из первого набора кавычек для каждой строки и поместить в массив. Например, возьмите этот текст:

2014-03-20 16:53:39.741 -0700   Information 638 NICOLE  Client "[WebDirect]" opening a connection from "24.114.54.155 (24.114.54.155)" using "iPad Safari 7.0 [fmwebdirect]".
2014-03-20 16:53:39.741 -0700   Information 94  NICOLE  Client "[WebDirect] (24.114.54.155) [24.114.54.155]" opening database "ProShopPartner_v1" as "[Guest]".
2014-03-20 16:58:45.163 -0700   Information 98  NICOLE  Client "[WebDirect] (24.114.54.155) [24.114.54.155]" closing database "ProShopPartner_v1" as "[Guest]".
2014-03-20 16:58:45.163 -0700   Information 22  NICOLE  Client "[WebDirect] (24.114.54.155) [24.114.54.155]" closing a connection.

Массив должен содержать:

[WebDirect]
[WebDirect] (24.114.54.155) [24.114.54.155]
[WebDirect] (24.114.54.155) [24.114.54.155]
[WebDirect] (24.114.54.155) [24.114.54.155]

Прямо сейчас у меня есть:

$filename = 'C:/Program Files/FileMaker/FileMaker Server/Logs/Access2.txt';

$lines = file($filename, FILE_IGNORE_NEW_LINES);

foreach ($lines as $line) {

    $matches = array();
    preg_match('/^[^"]*"([^"]*)"$/', $lines, $matches);
    $contentInsideFirstQuotes= $matches[1];
}

Но это не даст мне только содержание в первом наборе цитат.

2 ответа

Решение

Если вы собираетесь построчно, просто сделайте это просто "([^"]*)" и использовать preg_match() который будет выполнять неглобальный поиск (возвращая только первое совпадение):

foreach($lines as $line) {
    if(preg_match('/"([^"]*)"/', $line, $matches)) {
        $result[] = $matches[1];
    }
}

Если вы хотите сделать весь файл сразу, вы можете использовать глобальное соответствие (preg_match_all()) и подготовить .* после вышеприведенного выражения. Это будет соответствовать всему, вплоть до символа новой строки:

"([^"]*)".*

демонстрация


Наконец, чтобы удалить группу захвата из исходного выражения, вы можете использовать обходные пути:

foreach($lines as $line) {
    if(preg_match('/(?<=")[^"]*(?=")/', $line, $matches)) {
        $result[] = reset($matches); // $matches[0]
    }
}

Примечания: я использую [^"]* (жадный) вместо .*? (ленивый), потому что он более конкретен и предотвратит ненужный возврат. Кроме того, если вы хотите потребовать что-то между цитатами (т.е. test "" "foo bar" возврате foo bar не ) затем поменяйте * в +,

Попробуй это

  $filename = 'C:/Program Files/FileMaker/FileMaker Server/Logs/Access2.txt';

    $lines = file($filename, FILE_IGNORE_NEW_LINES);
    $result = array();
    foreach ($lines as $line) {
        preg_match('/^[^"]*"([^"]*)"$/', $line, $matches);
        $result[] = $matches[1];
    }

print_r($result);
Другие вопросы по тегам