我想从每行的第一个引号集中提取文本并放入数组中。例如,请使用以下文字:
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];
}
但它不会只给我第一个引号组中的内容。
答案 0 :(得分: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]
}
}
注意:我使用[^"]*
(贪婪)代替.*?
(懒惰),因为它更具体,可以防止不必要的回溯。另外,如果您想要在引号之间要求某些内容(即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);