首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >preg_match表示包含逗号和空格的字符串。

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

Stack Overflow用户
提问于 2012-12-13 08:07:40
回答 1查看 1.1K关注 0票数 0

我有一张从txt文件中提取web应用程序日志的纸条。在最近在我们的数据库中输入带有逗号的值之前,提取日志没有问题。我目前正在使用preg_match来匹配字符串模式,其中之一如下所示:

代码语言:javascript
复制
preg_match("/\[params\] (.*?) \[/i", $record, $regs);

以上用于匹配日志文本文件中的内容,如: params客户:上海浦东香格里拉,poi_id: 14747,language: en.(我在匹配方面没有问题。最近,以字符串包含逗号的方式创建了一个条目。例如:

代码语言:javascript
复制
[params] customer: Shangrila Shanghai, Pudong poi_id: 14747, language: en

我想,由于逗号的缘故,preg_match只会在“上海香格里拉”之前进行匹配。因此,我无法提取特定客户的日志。为了避免将来出现这样的问题,我已经更改了数据库中的条目,但是我需要提取前几个月的日志。

我是正则表达式的初学者,一直在绞尽脑汁解决这个问题。“上海香格里拉,浦东”,而不是“上海香格里拉”,有什么可以改变的呢?

我希望我是明确的,任何帮助都会得到高度认可。提前谢谢。下面是代码块:

代码语言:javascript
复制
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,页面: 1,语言: cn,ip_address:..*.* headerss:12:"GEOIP_REGION";s:2:"23";s:17:"GEOIP_REGION_NAME";s:8:"Shanghai";s:10:"GEOIP_CITY";s:8:"Shanghai“

EN

回答 1

Stack Overflow用户

发布于 2012-12-13 08:49:30

当我使用这些测试数据运行您的regex时,它运行得非常好。

代码语言:javascript
复制
$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,record_limit: 20,页面: 1,语言: cn,ip_address:.

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

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

代码语言:javascript
复制
$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];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13855521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档