Строка - Как получить содержимое в первом наборе кавычек и поместить в массив
Я хочу извлечь текст из первого набора кавычек для каждой строки и поместить в массив. Например, возьмите этот текст:
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);