2011-04-12 45 views
0

我正在創建一個系統來註冊不同的事件。對於每個事件它存儲的地址,該地址可以是下列之一:如何知道文本字符串是Facebook的網址,電子郵件地址或其他uri?

  1. Facebook的資源(基本上開頭的網址 「facebook.com」)
  2. E-mail地址(任何有效的電子郵件)
  3. 另一個URL
  4. (假/捶打/等)

第四是不重要的。

根據地址類型(FB API /發送電子郵件/ POST表單),我需要做不同的事情。我在考慮只存儲它是什麼類型,但我首先想問問是否有一些正則表達式或類似的知道它是什麼類型。

第一個很容易,只需檢查它是否以「http://www.facebook.com」開頭。對於其他人,我考慮過尋找像「http://」或「@」這樣的標記,但後來我認爲它們都可以包含這兩個標記。

+1

這是清爽的設計存儲類型,而不是依賴於內容搞清楚什麼類型可能是。在你的情況下,可以告訴類型,但想象一下,如果添加了其他類型,現在需要更改(複雜)邏輯來添加新類型。在某些情況下,甚至可能是不可能的。所以我會建議存儲類型。 – 2011-04-12 01:26:14

回答

1

首先,@zespri在他的評論中是正確的 - 這是一個更好的設計來存儲實際類型。即使你使用我在下面建議的正則表達式,事情仍然會在未來破裂。

但是,是的,它可能在這種情況下使用正則表達式:

以下的正則表達式是典型的電子郵件探測器。使用比'@'符號更安全:

 
([a-zA-Z]+[a-zA-Z0-9._+\-]{3,}(?:@|%40)[a-zA-Z0-9]+[a-zA-Z0-9\.\-]?(?:\.[a-zA-Z]+)+) 

以下三個找到facebook配置文件和頁面。 可以擺脫後綴的留剛剛facebook的域,或做一些進一步的研究和編輯,以限制其他類型的Facebook資源:

 
facebook\.(?:com?\.|net\.)?[a-z]{2,3}/.+\?id=(\d+) 
facebook\.(?:com?\.|net\.)?[a-z]{2,3}/p\.php.+i=(\d+) 
facebook\.(?:com?\.|net\.)?[a-z]{2,3}/(\w[\w\.\-]+\w)(?:$|[/\?#]) 

避免的「http:// WWW 「。前綴 - 你永遠不會知道可以使用哪個子域名,而且通常會被忽略。 還要注意的是有更多的頂級域名的不僅僅是.COM

對於「其他」的網址給Facebook,你可以只認準錨

^https?://
這是從你的問題還不清楚用戶是否輸入這些進入你的系統,還是它的以不受控制的方式完成。請注意,人們通常會忽略http前綴,所以這不是真正可靠的檢測URL的方式。

如果您正在尋找網址的HTML頁面中的鏈接,他們可以通過搜索錨更可靠地檢測:

<a\s+(?:.*?)href=['"]?(https?://[^'^"^\s]+)(?:.*?)> 
+0

感謝您的回答。我決定採用你們推薦的方式,保存類型和地址。 – 2011-04-12 11:43:18

相關問題