2013-09-24 18 views
0

我正在處理一個網頁,並且正在處理字符串操作的正確方法,我試圖解決這個問題。不幸的是,正則表達式並不是微不足道的,我一直在遇到麻煩。任何幫助表示讚賞;將www * .com更改爲REGEX可點擊的URL

我想從一個PHP表單輸入字符串到可點擊的鏈接。我接受了第一次挑戰的幫助;如何將以http,https或ftp開頭的字符串轉換爲可點擊的鏈接;

function make_links_clickable($message){ 
    return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()[email protected]:%_+.~#?&;//=]+)!i', '<a href="$1" target="_blank">$1</a>', $message); 
} 

$message = make_links_clickable($message); 

而且這個效果很好。當我看到它(並做了一些研究)時,我可以從語法中收集到的最好結果是,第一部分是匹配ftp,http和https,:和//以及各種組合模式。我想知道我可以如何;

1)請聯繫以www開始,或.COM/.NET/.ORG結尾的/ etc點擊(如google.com或www.google.com - 離開了HTTP://)

2)變更YouTube鏈接一樣

"https://www.youtube.com/watch?v=examplevideo" 

"<iframe width="560" height="315" src="//www.youtube.com/embed/examplevideo" frameborder="0" allowfullscreen></iframe>" 

我覺得這兩種情況基本上做同樣的事情,但搞清楚是不直觀。任何幫助將深表感謝。

+2

不要太嚴格什麼的網址與你或結束將使用其他路徑信息(如www.something.co.uk/about)排除非美國網站和網址。 – nnnnnn

+0

提示:(。ABC * | * HIJ)的正則表達式''匹配以'abc'開始或'hij' – justhalf

回答

2

第一個正則表達式與匹配ftp://,http://,https://的幾乎所有內容匹配,所以最好將其他語言實現爲獨立的表達式,因爲它們會只能匹配主機名。

對於數字1,您需要確定您希望如何匹配不同的頂級域名(.com/.net/etc)。例如,您可以像這樣明確地匹配它們:

(www\.)?[a-z0-9\-]+\.(com|net|org) 

但是,這隻會匹配以.com,.net或.org結尾的網址。如果您需要所有頂級域名並且只有有效的域名,則需要手動將它們全部寫入到最後。或者,你可以做這樣的事情,

(www\.)?[a-z0-9\-]+\.[a-z]{2,6} 

將接受任何看起來像一個網址,並以「點」,爲2〜6個字母(.museum和。旅行)的任意組合結束。但是,這將匹配「fgs.fds」之類的字符串。根據您的應用程序,您可能需要添加更多字符到[a-z],以添加對擴展字符字母的支持。

修改(2 Aug 14):正如下面的評論所指出的,這與TLD類似.co.uk。這裏是一個將:

(www\.)?[a-z0-9\-]+\.([a-z]{2,3}(\.?[a-z]{2,3})?) 

而不是兩個和六個字符(經過一段時間)之間的任何字符串,這將匹配任何兩到三年,然後又一個三(如果存在的話),有或無分期。

這將是多餘的,但你可以改爲在第二個選項www後刪除問號,然後做兩個測試;這樣,您就可以匹配任何以公共TLD結尾的字符串或以「www」開頭的字符串。後面跟着一個句點分隔的字符「gpspps.cobg」。它仍然會匹配可能實際不存在的網站,但至少它看起來像一個網址,它看起來像一個網址。

對於YouTube的一個,我去了一個小問號瘋狂。

(?i:(?:(?:http(?:s)?://)?(?:www\.)?)?youtu(?:\.be/|be\.com/watch\?(?:[a-z0-9_\-\%\&\=]){0,}?v\=))([a-zA-Z0-9_\-]{11}){0,}?v\=))(?i)([a-zA-Z0-9_\-]{11}) 

編輯:我只是試圖在我自己的項目中使用上述正則表達式,但我遇到了一些錯誤。我改變了一點,我覺得這個版本可能會更好:

(?i:(?:(?:http(?:s)?://)?(?:www\.)?)?youtu(?:\.be/|be\.com/watch\?(?:[a-z0-9_\-\%\&\=]){0,})?)(?:v=)?([a-zA-Z0-9_\-]{11}) 

對於那些不熟悉規則表達式,括號,(...regex...),存儲爲組,可以有選擇地挑選出匹配的字符串。以?:開頭的括號組在上面的大多數中是(?:www\.),但是不在組內。因爲正則表達式的結尾卻剩下來,這樣的正「俘獲」 -group,([a-zA-Z0-9_\-]{11}),您使用的功能$matches說法像preg_match,那麼你可以使用$matches[1]來獲取視頻,「examplevide」的YouTube的ID,然後工作不過你會喜歡它。另請注意,正則表達式只能匹配11個字符的ID。

此正則表達式匹配幾乎任何當前YouTube網址格式,包括不正確的情況下,進出(正常)訂單參數:

http://youtu.be/dQw4w9WgXcQ 
https://www.youtube.com/watch?v=dQw4w9WgXcQ 
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=featured 
http://www.youtube.com/watch?feature=featured&v=dQw4w9WgXcQ 
http://WWW.YouTube.Com/watch?v=dQw4w9WgXcQ 
http://YouTube.Com/watch?v=dQw4w9WgXcQ 
www.youtube.com/watch?v=dQw4w9WgXcQ 
+1

什麼樣.co.uk後綴結束? – BLaZuRE

+1

哦,是的,忘了那些。我會編輯它。 –

+0

嗨,404。謝謝你的解決方案。題;當我應用您的解決方案時,它似乎工作正常,但鏈接本身似乎附加到我的網站的URL。因此,如果該變量是google.com,則可點擊的鏈接將變爲「my.site.com/google.com」。我使用「返回的preg_replace( '((WWW \)[A-Z0-9 \ - ] + \ [AZ] {2,6})我!?!', '$1',$消息); 「 – Kimomaru

相關問題