preg_match表示包含逗号和空格的字符串

时间:2012-12-13 08:07:40

标签: php regex preg-match

我有一个从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);
  

[command]搜索[params]客户:浦东香格里拉,关键词:吧   粗,附近的poi:18270,record_limit:20,page:1,language:cn,   ip_address:。*。* [标题]   一个: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:” 中国 “; S:12:” GEOIP_REGION “; S:2:” 23 “; S:17:” GEOIP_REGION_NAME “; S:8:” 上海“; S:10: “GEOIP_CITY”; S:8: “上海”

1 个答案:

答案 0 :(得分:0)

当我用这个测试数据运行你的正则表达式时,它运行得非常好。

$record = '[command] search [params] customer: Pudong Shangri-La, Shanghai keywords: bar rough, nearby poi: 18270, record_limit: 20, page: 1, language: cn, ip_address: ..*.* [headers] 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:"Shanghai";s:10:"GEOIP_CITY";s:8:"Shanghai"';
preg_match("/\[params\] (.*?) \[/i", $record, $regs);
echo $regs[1];

显示

  

客户:浦东香格里拉大酒店,上海关键词:bar rough,附近poi:18270,record_limit:20,page:1,language:cn,ip_address:..

[params]完全匹配,直到[headers],包括逗号和冒号。

如果您只想提取客户名称,请根据您的示例字符串

尝试此名称
$record = '[command] search [params] customer: Pudong Shangri-La, Shanghai keywords: bar rough, nearby poi: 18270, record_limit: 20, page: 1, language: cn, ip_address: ..*.* [headers] 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:"Shanghai";s:10:"GEOIP_CITY";s:8:"Shanghai"';
preg_match("/\[params\]\s*customer:\s*(.*?)\s+keywords:/i", $record, $regs);
echo $regs[1];