2011-08-31 187 views
1

的正則表達式URL匹配問題我正嘗試在GitHub https://github.com/ErisDS/Migrate上使用此項目,將Wordpress數據庫中的URL設置從Localhost dev安裝遷移到實時URL。http:// localhost/

目前的代碼拋出的URL錯誤將被替換的「http://本地主機/ mysitename」,但並接受新的URL「http://www.mywebsitename.com」

從我可以告訴錯誤來自這個正則表達式不驗證本地主機作爲一個有效的URL - 任何想法如何我可以更新此接受本地主機的URL?

完整的代碼可以在GitHub上查看。

function checkURL($url) 
{ 
    $url_regex = '/^(http\:\/\/[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/'; 
if($url == 'http://') 
{ 
return false; 
}  
return preg_match($url_regex, $url); 
} 
+1

我得到這個從使用RegexBuddy:'(HTTPS | FTP |文件?):// [-A-Z0-9 + @#/%=〜_ | $:?!; ] * [A-Z0-9 + @#/%=〜_ | $]' –

回答

2

您可以將其更改爲它添加 「localhost」 的到可接受的主機名:

/^(http\:\/\/(?:[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}|localhost)(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/ 

這部分http://前綴匹配:

http\:\/\/ 

而且這部分的主機名匹配:

[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4} 

所以你可以改變主機名檢查,以明確包括「本地主機」非捕獲交替組:

(?:X|localhost) 

其中X是現有主機名匹配的子表達式。 (?:位啓動一個非捕獲組,使用非捕獲組可以確保任何組編號引用不會混亂。

還有一些活生生的實例:http://ideone.com/M0qqh

我認爲一個簡單的正則表達式可能有助於你更好的,雖然,一個不帶參數的CGI處理得非常好。你可以試試這個:

/(http:\/\/[^\/]+\/([^\s]+[^,.?!:;])?)/ 

看看它是否適用於你的數據。那個很寬鬆,但可能足夠完成一次轉換。這應該適當地匹配這些網址:

'here is a URL http://localhost/x?a=b.' 
'More http://example.com nonsense!. 

您也可以嘗試Joseph的評論。

1

它不工作,因爲在正則表達式中的某個地方,你要求在http:///之間的點。 http://localhost/whatever沒有點,所以它失敗。

你真的應該使用類似filter_var()parse_url()而不是正則表達式來進行URL驗證。

相關問題