2013-07-02 38 views
0

我在尋找區分URL和拼寫錯誤的鏈接。例如:格式不正確的URL與perl中的斷開鏈接

錯字: www.google/com

斷開的鏈接: www.thislinkpointstonothing.org

,我想我的應用程序識別第一個URL作爲形狀錯誤,並指示第二網址返回404未找到時查詢。是否有perl模塊或正則表達式我可以用來做出區分?

我試圖區分由於拼寫錯誤導致的錯誤鏈接,或者 - 如果鏈接遵循RFC - 如果錯誤鏈接僅僅是由於頁面不再存在導致。

+3

如果www.google.com/com給你一個404,而不是名稱服務器錯誤等,我會擔心你的代碼/配置。 –

+0

可能會添加expr來檢查有效的url/something.something .com/ – michael501

+0

正則表達式如何可能決定某個URL是否昨天工作或者是錯字?如果可以的話,我能否告訴我該URL是否會在明天工作? – innaM

回答

0

您正在談論兩種不同類型的「查詢」:DNS查找和HTTP請求。 HTTP請求使用DNS查找 - 但並非總是如此。例如,服務器可以位於本地網絡上,您可以使用/etc/hosts文件中的IP地址和名稱信息向其請求頁面。鏈接名稱可能並不總是包含主機名稱部分,因爲它們可能是相對的(這通常是使網站能夠輕鬆地移動到反向代理之後或者主機名稱改變的好習慣。)

考慮到區分你的問題的要點 - 你是否可以檢查鏈接的正確性的URI與真正缺少的頁面(404)是完全一樣的 - 但是google/com的DNS查詢應該成功。你的應用程序是否被代理重定向到搜索頁面?

下面給出了一個粗略的近似答案 - 這可能不會太好用,但你會明白的。對於perl中的更多有用的方法,你可能想要檢查一些更有用的方法perl的框架(CatalystMojo)有這樣做的方法。此外,如果您正在爲您的前端用戶界面(即網頁上的javascript)執行此操作,則可能會建立更快或更簡單的方法。下面的步驟看起來像你想要做的每個鏈接:

1檢查鏈接/ URI是否「正常」;如果不打印錯誤;如果是,則:

2在鏈接/ URI的主機部分執行DNS查找;如果不打印錯誤;如果成功,則:

3嘗試獲取網頁並打印任何錯誤,或者如果它成功,這樣說

衡量「成功」很難,雖然自動化:它應該被嚴格定義爲狀態「200 OK 「?也許你或其他成員可以添加該部分,並找到一個優雅的方式來閱讀「鏈接」(破碎或其他)。

此腳本使馬虎使用our存儲東西,並不會運行use strict。請某人使它看起來更好,並且只使用CORE ::模塊:-)

use Regexp::Common qw/URI/;          
use Net::DNS;      
use 5.10.0;                 
use LWP::UserAgent; 

my $url = "http://www.google.com/adsfdsa" ; 
my $lookup = Net::DNS::Resolver->new;          
my $ua = LWP::UserAgent->new;            

### Step 0. regexp the URI ##            

if ($url =~ /$RE{URI}{HTTP}{-keep}/){          
    say "$url is a URI ";             
    our $hostpart = $3; # stash the host part as per man page     
    our $filepart = $5; # stash the path          
}                   

### Step 1. do a DNS look up and if it succeeds then or else ... etc. ###  

if ($lookup->query($hostpart)) { say "$hostpart is a valid host" }   
else { say " but $hostpart is an invalid host" }        

### Step 2. fetch the page and check the return code ###     

my $request = HTTP::Request->new(GET => $url);        
my $response = $ua->request($request);          

if ($response->is_success || $response->is_redirect) {      
    print $request->content;             
}                   
else {                  
    say "but $filepart is an invalid path";         
} 

輸出:(!但更短,更優雅,更有效)

http://www.google.com/adsfdsa is a URI 
www.google.com is a valid host 
but /adsfdsa is an invalid path 

你可以做一些像上面從您的輸入中讀取並將相應的消息返回給您的用戶,即從發生錯誤的任何地方(即在步驟0.,1或2)。請注意,有可能更快,更簡單的方式來做到這一點,但像Regexp::CommonLWP這樣的模塊很好地鍛鍊和探討。