适用于与格式匹配的URL的正则表达式,但排除与该URL格式匹配的参数

时间:2017-03-09 10:04:00

标签: regex perl

我正在尝试梳理一些日志。我正在寻找格式为http://something/something.php的日志。我目前有这个:

https?.*?\.php

这个问题是我的一些日志中包含带参数URL的URL,如下所示:

http://hello/world.asp?redirect=http://something/else.php
http://hello/blah.asp?abc=/blah/blah.php

某些日志包含多个参数,并且URL可以位于任何位置,而不一定位于该行的末尾。所有这些都得到匹配。在上面的示例中,实际网址是.asp,只是它有一个.php参数。

我可以使用哪种正则表达式仅在实际目标为.php时匹配,而不是其中一个参数是具有.php的网址。

2 个答案:

答案 0 :(得分:1)

限制自己使用正则表达式解决方案永远不是一个好主意

使用URI模块方便地处理URL字符串

喜欢这个

use strict;
use warnings 'all';

use URI;

while ( <DATA> ) {

    chomp;

    my $url = URI->new($_);

    my $ok = $url->scheme =~ /\Ahttps?\z/ && $url->path =~ /\.php\z/;

    printf qq{URL "%s" %s\n}, $url, $ok ? "matches" : "doesn't match";
}

__DATA__
http://something/something.php
http://hello/world.asp?redirect=http://something/else.php
http://hello/blah.asp?abc=/blah/blah.php

输出

URL "http://something/something.php" matches
URL "http://hello/world.asp?redirect=http://something/else.php" doesn't match
URL "http://hello/blah.asp?abc=/blah/blah.php" doesn't match

答案 1 :(得分:0)

而不是匹配网址中的任何字符 - 排除“?”并从头开始(^)

^https?[^\?]*\.php