2

我有一个这样的字符串:

url.com/my?a=hello&b=world&z=foo

我需要删除aandb参数,但不是z. 所以我正在使用以下最有效的正则表达式:

s#((?<=\?)|(&))(a|b)=\w*(?(2)((?=&)|$)|(&|$))##g

基本上,它检查aorb是否由?(look-behind) or前置&,并且它必须以&字符串结尾或结尾。如果它&在开始时匹配,它可能&在最后匹配但不消耗它。

我遇到的问题是,如果它们是连续的,它匹配a但不匹配b,所以它导致:

url.com/my?b=world&z=foo

我猜在匹配a位置之后已经超过了前一个匹配,所以它开始查看b=...而没有再次看到后视字符?,我怎样才能让它再次搜索,包括未使用的字符,或者我应该分开替换并独立搜索所有字符串?

4

1 回答 1

3
use URI             qw( );
use URI::QueryParam qw( );

my $uri = 'http://url.com/my?a=hello&b=world&z=foo';

$uri = URI->new($uri);
$uri->query_param_delete($_) for qw( a b );

print "$uri\n";   # http://url.com/my?z=foo
于 2013-05-29T17:04:28.773 回答