2011-06-28 29 views
0

我計算出這個表達式並在其工作接近,但只多了一個問題,它的任何字匹配與超過一個週期PHP正則表達式的URL

例如(。):塞入...(GOT匹配)

如何在正則表達式中限制句號爲「每個括號只允許1個句點」?

'#((\w+://)?(\w+\.)([a-z0-9\-/.?=_&%])+)#i' 
+1

\。{1}正常工作,但我不知道php :-) –

+1

它是一個preg_match來替換文本中的鏈接。所以也許過濾器不能幫助? 我嘗試了{1},但是如果我放入,我會收到錯誤: '#((\ w +://)?(\ w + \。)([a-z0-9 \ - /。{ 1}?= _&%])+)#i' – pakito

+0

Pakito,當您提出有關URL的問題時,您會參考RFC?也很好地瞭解該協議。這是專門爲http和https協議? – hakre

回答

0

試試這個:

'#((\w+://)?(\w+)(\.[a-z0-9\-/?=_&%]+)+)#i' 

這需要每個週期後的非週期炭。

但我會建議是這樣的:

'#((\w+://)?\w+(\.[a-z0-9\-]+)*\.[a-z\-]{2,}(/[\w\-./?=&%]*)?)#i' 
+0

不幸的是,這種可接受的URI像'http://.- sample.-com'是無效的(短劃線不能是第一個字符)。 –

+0

@Igor:是的,但是合法URI的正確RegEx會太長... – Floern

+0

lol我在facebook上使用http://.-sample.-com測試過,它也被接受爲有效的網址。 – pakito

0

這應該工作:

[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4} 

在你使用正則表達式的問題是,您使用的字符類,包括你的時期貪婪版的「+」。我在這裏發佈的正則表達式只檢查名稱中的單個常量。

此模式將成功匹配google.com,www.google.com以及任意數量的子域名。

注意:ICANN最近宣佈很快他們將允許任何頂級域名(例如,而不是隻是.com,.org等,他們將很快允許.whatever),因此您可能需要調整最後一部分的正則表達式「{2,4}」,因爲TLD不久將是任意長度的。

+0

已經錯過'.museum'。 –

+0

是的,感謝normalo,那是(tld)我正試圖避免的。 – pakito

+0

啊,不知道。博物館已經在使用了。那麼,這使得它有點更具挑戰性,因爲現在你基本上在尋找任何.combination.of.valid.characters.delimeted.by.periods.without.spaces.and.not.ending.in.a.punctuation。標記:S挑戰來自可能的假陽性匹配的增加。我想你只需要嘗試一下,看看會發生什麼。 – jefflunt

0

好吧,如果你想驗證的URL,爲什麼不使用parse_url()?我認爲爲這麼多不同的URL表單創建一個普通的正則表達式很困難