2009-07-24 481 views
27

我正在使用正則表達式將純文本URL轉換爲可單擊的鏈接。URL可以包含分號嗎?

@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@

但是,有時在文中的主體中,URL被枚舉每行一個在端部分號。真實網址不包含任何「;」。

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123; 
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124 

允許在URL中使用分號(;)還是可以將分號視爲URL末尾的標記?這怎麼符合我的正則表達式?

回答

35

A semicolon is reserved並且除特殊用途(取決於方案)外,不得使用未編碼。 2.2節:

許多URL方案保留一定的 字符有特殊含義: 它們在URL的 具體方案的部分外觀有 指定的語義。如果在一個方案中保留對應於八位組的字符 爲 ,則八位位組必須編碼爲 。字符「;」, 「/」,「?」,「:」,「@」,「=」和「&」爲 字符,其可以是在 方案中保留用於特殊含義的字符。在方案中保留其他字符不可以是 。

+19

「不得使用未編碼」:...用於除特殊含義以外的目的。該問題的正確答案是「是的,在URL中使用分號是合法的」,但是我從這個答案中得到的印象(不是規格報價,而是總結)是「不,未編碼的分號可能不是在URL中使用「。 – Miles 2009-07-24 14:53:42

+0

@Miles編輯澄清 – Greg 2009-07-24 14:57:05

+0

我遲到了,但此代碼明確處理http/https網址,允許;作爲查詢字符串分隔符(而不是&)......實際上,Ben已經覆蓋了這一點。 – Powerlord 2010-02-22 20:30:47

11

分號是合法的URI字符;它屬於子定界符類別:http://www.ietf.org/rfc/rfc3986.txt

然而,說明書指出該半顏色是否是合法用於特定 URI或不取決於該URI的方案或生產者。因此,如果使用這些鏈接的網站不允許分號,那麼它們對於該特定情況無效。

23

W3C鼓勵CGI程序接受;以及查詢字符串中的&(即,以相同方式對待?name=fred&age=50?name=fred;age=50)。這應該是因爲&必須編碼爲& amp;在HTML中,而;沒有。

1

引用RFC在回答這個問題時並不是那麼有用,因爲您會遇到帶有分號(以及逗號)的URL。我們有一個沒有處理分號和逗號的正則表達式,我們在NutshellMail上的一些用戶抱怨說,因爲包含它們的URL確實存在。嘗試在Facebook或Twitter中構建包含';'的虛擬URL或「,」你會看到這兩個服務正確地編碼完整的URL。

我換成我們使用與下面的模式正則表達式(並測試了它的工作原理):

string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])"; 

這個表達式從http://rickyrosario.com/blog/converting-a-url-into-a-link-in-csharp-using-regular-expressions/來(有輕微的修改)

4

是的,分號在URL中有效。但是,如果您從相對非結構化的散文中摘取它們,則可能安全地認爲URL的處的分號意味着作爲句子標點符號。對於其他句子標點符號也是如此,例如句點,問號,引號等。

如果您只對具有明確的http[s]協議的URL感興趣,並且您的正則表達式支持lookbehinds,則該正則表達式應該足夠了:

https?://[\w!#$%&'()*+,./:;[email protected]\[\]-]+(?<![!,.?;:"'()-])

協議之後,它簡單地匹配一個或多個字符可以是在URL有效,無需擔心結構在所有。但是,它會根據需要退出儘可能多的位置,直到最後的字符不是可能是句子標點符號。

6

從技術上說,分號是URL字符串中的合法子分隔符;上面引用了大量源文件,包括http://www.ietf.org/rfc/rfc3986.txt

有些人將其用於合法目的,儘管它的使用可能是特定於站點的(即僅用於該站點),因爲它的使用必須由網站使用它定義。

但是,在現實世界中,URL中分號的主要用途是在合法URL後面隱藏病毒或網絡釣魚URL。

例如,某人發送一封電子郵件,此鏈接:

的http:// www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file/

將導致雅虎鏈接(www.yahoo.com/junk/nonsense)被忽略,因爲即使它是合法的(即正確形成),也不存在這樣的頁面。但第二個鏈接(0200.0xfe.0x37.0xbf/malicious_file /)可能存在*,用戶將被引導至惡意文件頁面;於是一個公司的IT經理將會得到一份報告,而且一個人可能會得到一個粉紅色的提示。

並且在所有的可否代言人得到他們的皮頭之前,這正是Facebook新的網絡釣魚問題的作用方式。名稱已經改變,像往常一樣保護有罪。

*據我所知,實際上沒有這樣的頁面。顯示的鏈接僅用於本討論。

相關問題