2013-06-04 64 views
1

URL的BNF形式在URL中提到:語法與正則表達式解析URL?

http://www.w3.org/Addressing/rfc1738.txt

我需要做的是從HTML文本中提取的URL。現在,我不知道我能代表

  String alpha  = "[a-zA-Z]"; 
    String alphadigit = "[a-zA-Z0-9]"; 
    String domainlabel = alphadigit+"|"+alphadigit+"("+alphadigit+"|-)*?"+alphadigit;  
    //String toplabel = alpha+"|"+alpha+"("+alphadigit+"|-)*?"+alphadigit; 
    String toplabel = "com|org|net|mil|edu|(co\\.[a-z]+)"; 
    String hostname = "(("+domainlabel+")\\.)*("+toplabel+")"; 
    String hostport = hostname; 

    String lowalpha = "([a-z])"; 
    String hialpha  = "([A-Z])"; 
    String alpha  = "("+lowalpha+"|"+hialpha+")"; 
    String digit  = "([0-9])"; 
     String safe  = "($|-|_|.|\\+)"; 
    String extra  = "(!|\\*|'|\\(|\\)|,)"; 
    //String national = "{" | "}" | "|" | "\" | "^" | "~" | "[" | "]" | "`"; 
    String punctuation = "(<|>|#|%|\")"; 
    String reserved = "(;|/|?|:|@|&|=)"; 
    String hex   = "("+digit+"[A-Fa-f]"+")"; 
    String escape  = "(%"+hex+hex+")"; 
    String unreserved = "("+alpha+"|"+digit+"|"+safe+"|"+extra+")"; 
    String uchar  = "("+unreserved+"|"+escape+")"; 
     String hsegment = "(("+uchar+"|;|:|@|&|=)*)"; 
     String search  = "("+uchar+"|;|:|@|&|=)?)"; 
    String hpath  = hsegment+"(/"+hsegment+")*"; 
    //String httpurl = "http://"+hostport+"(/"+hpath+"(?"+search+")?)?"; 
    String httpurl = "http://"+hostport+"/"+hpath; 

最後的正則表達式:

http://(([a-zA-Z0-9]|[a-zA-Z0-9]([a-zA-Z0-9]|-)*?[a-zA-Z0-9])\.)*(com|org|net|mil|edu|(co\.[a-z]+))/(((((([a-z])|([A-Z]))|([0-9])|($|-|_|.|\+)|(!|\*|'|\(|\)|,))|(%(([0-9])[A-Fa-f])(([0-9])[A-Fa-f])))|;|:|@|&|=)*)(/(((((([a-z])|([A-Z]))|([0-9])|($|-|_|.|\+)|(!|\*|'|\(|\)|,))|(%(([0-9])[A-Fa-f])(([0-9])[A-Fa-f])))|;|:|@|&|=)*))*

所以你可以看到我所代表的整個BNF到大正則表達式,將與javax.util使用。正則表達式方法從文本中提取URL。現在這是正確的方法嗎?如果它是正確的,那麼爲什麼我們需要編寫一個上下文無關文法?正則表達式方法有什麼缺點?

此外,對於語法分析器來說,對於語言來說,語法用於驗證代碼是否遵循語法規則,否則會顯示一些錯誤消息。同樣使用語法,我們得到一個用於評估表達式的語法樹。對於URL的東西,我們沒有對任何東西進行任何處理我們只需要從其他文本中提取網址。

我得到了這個問題,因爲以前我試圖解析電子郵件地址。在詳盡地搜索正則表達式之後,他們都沒有發現100%的準確性,並且有人評論了正則表達式與RFC中的確切BNF形式的電子郵件地址相匹配的侷限性。因此可能需要語法(而不是正則表達式)。因此,我有這個問題的網址。

感謝

+0

只是爲了確保,你是知道的非ASCII網址,不是嗎? – shabunc

+0

爲什麼你想[重新發明輪子](http://stackoverflow.com/a/285880/878469)? – predi

+0

你確定這是一個好方法嗎?因爲我會處理成千上萬的網頁,如果我做這個URL檢查的話,每個網頁都會產生不必要的異常。除了我的情況下的URL甚至可能不包含http部分,那麼它肯定會給出畸形的url異常。事實上,如果他們已經包含所有這些HTTP,那麼我首先不會有問題。 – user285825

回答

0

嗯,我覺得您的問題可以更容易地使用有關http鏈接看起來像在自由文本一些啓發來解決。它可以工作比這種複雜的正則表達式快多了,特別是如果我們談論的是大文章:

  1. HTTP鏈接(URL)具有獨特的http://
  2. 從開始到結束的網址不包含一些字符集的開始(例如白色空格)。當你遇到這種字符時,這意味着你找到了URL的結尾。
+0

是的,這是問題。我將解析craigslist網頁,並且手動輸入文本而不考慮任何形式。所以有些網址可能是這樣的:http://blahblah.com.Location:atlanta。因此,我必須嚴格遵守正則表達式來排除發生這種事情的可能性(即,我不是100%依賴,因爲一些瘋狂的用戶可能輸入URL而不考慮適當的標點符號和期望讀者閱讀帖子的結構靠他自己)。因此,我對任何啓發式方法都沒有100%的信心。 – user285825

+0

那麼,任何'URL'都可以自由地包含'Location'字,因爲命名資源的規則可以自由地爲本地資源提供這樣的名稱。 – Andremoniy

0

如果您要解壓縮的URL在標籤內(例如錨標籤的href屬性),那麼我建議使用JSoup解析和檢查HTML。

http://jsoup.org/

內文本的身體,我敢肯定,更簡單的正則表達式的方法是可行的,大概是在協議匹配(HTTP://)