你能帮我做一下perl regexp来取代 (http://.+)到http://www.my1.com/redir?$ 1 但对http://www.my1.com/或http://my1.com/
等网址不执行任何操作例如我需要更换 http://whole.url.site.com/foo.htm到http://www.my1.com/redir?http://whole.url.site.com/foo.htm http://www.google.com到http://www.my1.com/redir?http://www.google.com 但请保持http://www.my1.com/index.php。
非常感谢!
答案 0 :(得分:7)
如果您在Perl脚本中执行此操作,请不要使用正则表达式。在这种情况下阅读它们是一团糟,到目前为止,每个正则表达式的答案都被打破了,因为它没有URI转义你要放入查询字符串的东西。
不要试图自己解析URI,而是让经过时间考验的URI模块为您处理所有边缘情况。 URI::Escape模块可以帮助您创建查询字符串,这样您就不会被URL中的奇数字符占用:
#!perl
use URI;
use URI::Escape;
while( <DATA> )
{
chomp;
my $url = URI->new( $_ );
if( $url->host =~ /(^|\.)my1\.com$/ ) {
print "$url\n";
}
else {
my $query_string = uri_escape($url->as_string);
print "http://www.my1.com/redir?$query_string\n";
}
}
__DATA__
http://whole.url.site.com/foo.htm
http://www.google.com
http://www.google.com/search?q=perl+uri
http://www.my1.com/index.php
http://my1.com/index.php
http://moremy1.com/index.php
答案 1 :(得分:2)
s{http://www\.nop1\.com/}{http://www.my1.com/redir?http://www.nop1.com}g
符合您的要求。
如果您的要求略有不同,您需要准确解释您的需求。
另外,我不确定这与否定前瞻有什么关系。
编辑:有了重新提出的问题,我们走了:
s{^http://(?!(?:www\.)?my1\.com)(.+)}{http://www.my1.com/redir?$1}g
(稍微调整一下)
答案 2 :(得分:1)
您可能想要捕获网址的网站名称,如果是这样,请尝试以下操作:
s{http://www\.(.*?)\.com/}{http://www.my1.com/redir?http://www.$1.com}g
答案 3 :(得分:0)
这可能不是一个好主意,但可以做到:
$foo='http://www.foo.com/';
$foo =~ s#^(http://(?!(?:www\.)?my1\.com/).+)$#http://www.my1.com/redir?$1#;
print $foo;
结果:
http://www.my1.com/redir?http://www.foo.com/
正如Brian在评论中指出的那样,它不适用于不以'/'结尾的网址。我不确定你是否要重写该URL。正如我在对你的问题的评论中所说,你真的需要更准确地说明你想要做什么以及为什么你需要使用正则表达式来完成这个任务。
答案 4 :(得分:0)
s|(http://www\.(?!my1\.)(.*)\.com)|http://www.my1.com/redir?$1|i;
这匹配任何不是www.my1.com的www。*。com网站并将其置于重定向中。