2010-01-26 77 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