2010-01-26 33 views
1

能否请你帮我做Perl的正则表达式替换 (http://.+),以http://www.my1.com/redir?$ 1 却又无可奈何对于网址像http://www.my1.com/http://my1.com/如何重写除特定网域之外的网址?

比如我需要更换 http://whole.url.site.com/foo.htmhttp://www.my1.com/redir?http://whole.url.site.com/foo.htm http://www.google.comhttp://www.my1.com/redir?http://www.google.comhttp://www.my1.com/index.php未经处理。

非常感谢!

+0

对不起,我最初制定 – 2010-01-26 21:40:28

+1

混淆你什么你的意思做'如http:// WWW。 my1.com/或http:// my1.com /',在这里我特别感兴趣的是你所指的'like'。 – 2010-01-26 21:46:36

回答

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/ 

布赖恩在评论它不会与不中“/”结尾的网址工作指出。我不确定是否要重写该网址。正如我在对您的问题发表评论时所说的,您确实需要更准确地了解您要做什么以及为什么需要使用正则表达式来完成此任务。

+2

这一个失败http://www.my1.com没有/ 最后。不是我认为你应该写这样的网址,但人们会这样写。 – 2010-01-27 03:08:42

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 

(扭捏了一点)

+0

我想我可能会在.com之后放置一个/或一个字符串锚点的结尾,所以当TLD爆炸的数量不会中断时。 :) – 2010-01-27 03:06:59

+0

这可能是一个好主意,是的。特别是考虑到写入后,这将*不*取代完全有效的网址http://www.my1.com。au – 2010-01-27 03:13:51

1

你可能会想捕捉URL的网站名称,如果是的话试试这个:

s{http://www\.(.*?)\.com/}{http://www.my1.com/redir?http://www.$1.com}g 
+0

PS感谢@Anon。我只是修改了他的答案... – harschware 2010-01-26 21:36:08

+0

注意:OP在发布答案后编辑了问题陈述... – harschware 2010-01-26 21:41:04

+1

这也将重写http://www.my1.com/至http://www.my1.com/redir ?http://www.my1.com但问题是如何避免这个域www.my1.com – 2010-01-26 21:42:08

0
s|(http://www\.(?!my1\.)(.*)\.com)|http://www.my1.com/redir?$1|i; 

这个匹配WWW。*。com网站,是不是www.my1.com,并把它重定向。

+0

为什么将它限制为以www开头并以.com结尾的主机?这里有很多主机名。 :) – 2010-01-27 03:05:18

+0

我知道。由于这个问题的重点似乎是关于负面看法,我是在字面上回答这个问题。事实上,标题过去基本上是“如何在这个URL正则表达式中使用负向预览”。 – 2010-01-27 05:27:10

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 
+0

嗨。感谢您指点。顺便说一句,我必须处理数据库和我需要替换URI的大块文本。所以无论如何,我必须使用正则表达式出于那个特定的原因 – 2010-01-27 07:00:54

+0

你不必使用正则表达式重新格式化它们。 URI :: Find可以在文本中找到它们,并使用回调替换它找到的内容。 – 2010-01-27 07:15:00