我正在尝试梳理一些日志。我正在寻找格式为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
的网址。
答案 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