string - 如何获取第一组引号内的内容并放入数组中

时间:2014-05-23 18:41:11

标签: php arrays regex quotations

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

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 个答案:

答案 0 :(得分:1)

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

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

如果您想立即执行整个文件,可以使用全局匹配(preg_match_all())并在上面的表达式之后添加.*。这将匹配所有内容直到换行符:

"([^"]*)".*

Demo


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

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

注意:我使用[^"]*(贪婪)代替.*?(懒惰),因为它更具体,可以防止不必要的回溯。另外,如果您想要在引号之间要求某些内容(即test "" "foo bar"返回foo bar而不是),请将*更改为+

答案 1 :(得分: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);