0

我想从每一行的第一组引号中提取文本并放入一个数组中。例如,以以下文本为例:

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];
}

但它不会只给我第一组引号中的内容。

4

2 回答 2

1

如果您逐行进行,只需保持简单"([^"]*)"并使用preg_match()它将进行非全局搜索(仅返回第一个匹配项):

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

如果您想一次完成整个文件,您可以使用全局匹配 ( preg_match_all()) 并.*在上述表达式之后添加前缀。这将匹配所有内容,直到换行符:

"([^"]*)".*

演示


最后,要从初始表达式中删除捕获组,您可以使用lookarounds

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

注意:我使用[^"]*(greedy) 而不是.*?(lazy) 因为它更具体并且可以防止不必要的回溯。此外,如果您想在引号之间要求某些内容(即test "" "foo bar"返回foo barnot ),则将 更改*+.

于 2014-05-23T18:49:14.087 回答
0

尝试这个

  $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);
于 2014-05-23T18:45:45.650 回答