Php preg_匹配包含逗号和空格的字符串

Php preg_匹配包含逗号和空格的字符串,php,regex,preg-match,Php,Regex,Preg Match,我有一张从txt文件中提取web应用程序日志的纸条。直到最近在我们的数据库中输入了一个带逗号的值,提取日志才有问题。我目前正在使用preg_match来匹配字符串模式,其中一个如下所示: preg_match("/\[params\] (.*?) \[/i", $record, $regs); 以上内容用于匹配我们日志文本文件中的内容,例如: [params]客户:上海浦东香格里拉,poi_id:14747,语言:en…(我在匹配这一点上没有问题。最近有一个条目的输入方式是字符串包含逗号。例如

我有一张从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只匹配到“Shangrila Shanghai”。因此,我无法提取该特定客户的日志。我已经更改了数据库中的条目,以避免将来出现此类问题,但我需要提取前几个月的日志

我是正则表达式的初学者,一直在挠头解决这个问题。有什么可以改变以匹配整个模式“Shangrila Shanghai,Pundong”,而不仅仅是“Shangrila Shanghai”

我希望我是清楚的,任何帮助都是高度赞赏的。提前谢谢。 以下是代码块:

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,记录限制:20,第1页,语言:cn, ip_地址:…***[标题] a:44:{s:10:“地理地址”s:13:“s:20:“地理区域大陆代码”s:2:“AS”s:18:“地理区域国家代码”s:2:“CN”s:18:“地理区域国家名称”s:5:“中国”s:12:“地理区域”s:2:“23”s:17:“地理区域名称”s:8:“上海”s:10:“地理区域城市”s:8:“上海”


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

$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];
它表明

客户:浦东香格里拉,上海关键词:酒吧粗糙,附近poi:18270,记录限制:20,页码:1,语言:cn,ip地址:

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

我认为您提供的正则表达式与您声称匹配的字符串不匹配。您确定您的问题是正确的吗?是的,我确定问题是正确的,我可以提供代码块和文本块。这将非常有用,因为此时您的问题没有意义。是的,它可以正常工作,但我有一个条目例如:“客户:浦东香格里拉,上海”,其中“浦东香格里拉,上海”是客户的名称。这必须匹配数据库中的条目,但我假设它只匹配“浦东香格里拉”,而与数据库中的条目不匹配。因此,“客户:浦东香格里拉”可以,但我希望客户:上海浦东香格里拉酒店"当客户名称中有逗号时匹配name@Uday你想提取客户的姓名吗?如果是,你问错了问题。不,如果我不清楚,我很抱歉。感谢你抽出时间。我想说的是,我想修改preg_匹配,以便在客户姓名中有逗号值的情况下uld识别为一个字符串,如客户:“上海浦东香格里拉”,而不是“客户:浦东香格里拉”, shanghai@Uday它已经有了,逗号没有任何区别。请参见修改后的答案。我修改了
$record
,并在逗号后添加了Shanghai,它显示整个字符串,包括Shanghai和所有内容,直到找到
[headers]
由于某些原因,我无法提取日志,我尝试删除数据库中的逗号,并且我能够提取当前日志,但我无法提取过去的记录,因为文本文件已经生成,在前几个月再次提取它们的任务非常艰巨。无论如何,非常感谢您的时间。非常感谢!