我有一个脚本,可以从 txt 文件中提取我们的 Web 应用程序的日志。直到最近在我们的数据库中输入带有逗号的值之前,提取日志没有问题。我目前正在使用 preg_match 匹配字符串模式,其中之一如下:
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
以上用于匹配我们的日志文本文件中的内容,例如:[params] 客户:上海浦东香格里拉,poi_id:14747,语言:en...(我匹配没有问题。最近在这样的地方做了一个条目字符串包含逗号的一种方式。例如:
[params] customer: Shangrila Shanghai, Pudong poi_id: 14747, language: en
我假设由于逗号,preg_match 只匹配到“上海香格里拉”。因此,我无法为该特定客户提取日志。我已经更改了数据库中的条目以避免将来出现此类问题,但我需要提取前几个月的日志。
我是正则表达式的初学者,一直在挠头来解决这个问题。可以改变什么来匹配整个“上海浦东香格里拉”而不是“上海香格里拉”?
我希望我很清楚,任何帮助都会受到高度赞赏。提前致谢。这是代码块:
foreach ($files as $filename)
{
$path = "$root/../request_archive/$filename";
$extracted = "$root/../request_archive/$filename.temp";
$fh = fopen($extracted, "r");
$count = 0;
while (!feof($fh))
{
$line = fgets($fh);
if (preg_match("/^\[id\]/", $line))
{
$count = 0;
$record = $line;
} else {
$count++;
$record .= $line;
if ($count > 1)
{
// echo "count: $count\n";
// echo "\n\n$record\n\n";
}
if (!isset($regs[1]) || $customer_name != $regs[1])
{
preg_match("/client: (.*?),/i", $record, $regs);
if (!isset($regs[1]) || $customer_name != $regs[1])
{
continue;
}
}
preg_match("/\[command\] (.*?) \[/i", $record, $regs);
$log_command = $regs[1];
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
$content = $regs[1];
preg_match("/\[request_time\] (.*?) \[i", $record, $regs);
【命令】搜索【参数】客户:浦东香格里拉,关键词:酒吧毛坯,附近poi:18270,record_limit:20,page:1,language:cn,ip_address :. .*.* [标题] a:44:{s:10:"GEOIP_ADDR";s:13:"";s:20:"GEOIP_CONTINENT_CODE";s:2:"AS";s:18:"GEOIP_COUNTRY_CODE" ;s:2:"CN";s:18:"GEOIP_COUNTRY_NAME";s:5:"China";s:12:"GEOIP_REGION";s:2:"23";s:17:"GEOIP_REGION_NAME";s :8:"上海";s:10:"GEOIP_CITY";s:8:"上海"