2010-06-14 74 views
1

我有一個網站,使用戶可以發佈消息到論壇。自動超鏈接URL和電子郵件的使用C#,同時留下定製標籤

目前,如果用戶輸入網址或電子郵件地址並將其發送,則其與任何其他文本片段的處理方式相同。

有些工具可以讓用戶提供超鏈接的網頁和電子郵件地址(通過一些定製的標籤/標記) - 有時會使用這些工具,但並非總是如此。此外,定製的「圖片」標籤也可用於引用網絡上託管的圖片。

我的目標是兼顧那些使用這些現有工具生成超鏈接地址的人,同時也爲那些只需輸入網址或電子郵件地址的人提供服務,然後自動將其轉換爲超級鏈接地址, (儘快提交他們的帖子)。

我找到了一個或兩個正則表達式來轉換一個純字符串的Web或電子郵件地址,但是,我顯然不想對已經通過網站定製標記處理的地址執行任何操作,這就是我被卡住的地方 - 如何排除任何通過定製標籤已經滿足的網站或電子郵件地址 - 我不想讓它們保持原樣。

這裏有我需要獨處的變化定製標記的一些例子:

[URL=www.msn.com]www.msn.com[/URL] 

[URL=http://www.msn.com]http://www.msn.com[/URL] 

[[email protected]][email protected][/EMAIL] 

[IMG]www.msn.com/images/test.jpg[/IMG] 

[IMG]http://www.msn.com/images/test.jpg[/IMG] 

下面的例子將然而非常需要分別被自動轉換成網絡&電子郵件中的鏈接:

www.msn.com 

http://www.msn.com 

[email protected] 

理想情況下,'轉換'的鏈接只需要根據本文前面的初始示例應用適當的定製標籤,而不是:

<a href="..." etc. 

他們會成爲:

[URL=http://www.. etc.) 

不幸的是,我們有存儲在整個這個定製標記的歷史數據,的很多,所以現在,我們想保留,與其實現完全新的方式來存儲我們的用戶帖子。

任何幫助將不勝感激。

謝謝。

回答

3

這是我使用的方法。我現在無法訪問完整的代碼庫,因此無法看到如何與論壇代碼一起停止雙鏈接,但試試看它是否適用於您...

/// <summary> 
    /// Turns any literal URL references in a block of text into ANCHOR html elements. 
    /// </summary> 
    public static string ActivateLinksInText(string source) 
    { 
     source = " " + source + " "; 
     // easier to convert BR's to something more neutral for now. 
     source = Regex.Replace(source, "<br>|<br />|<br/>", "\n"); 
     source = Regex.Replace(source, @"([\s])(www\..*?|http://.*?)([\s])", "$1<a href=\"$2\" target=\"_blank\">$2</a>$3"); 
     source = Regex.Replace(source, @"href=""www\.", "href=\"http://www."); 
     //source = Regex.Replace(source, "\n", "<br />"); 
     return source.Trim(); 
    } 
+0

這段代碼證明非常有用,我剛剛調整了幾個位來適應我的定製標記,到目前爲止它似乎在勾選所有框 - 留下我的定製標記未處理,但處理所有我需要的URL/Email實例。 source = Regex.Replace(source,@「([\ s])(www \ .. *?| http://.*?)( [\ s])「,」$ 1 [URL = $ 2] $ 2 [/ URL] $ 3「); source = Regex.Replace(source,@」([\ s])([a-zA-Z_0-9 .-] + \ @ @ [a-zA-Z_0-9 .-] + \。\ w +)([\ s])「,」$ 1 [EMAIL = $ 2] $ 2 [/ EMAIL] $ 3「); source = Regex.Replace(source,@「URL = www \。」,「URL = http:// www。」); 今天早上我會繼續進行一些額外的測試,然後回來...... – marcusstarnes 2010-06-15 08:50:23

+0

這似乎很好地工作 - 我一直在做很多測試,並且一直無法破解(迄今爲止),因此將此標記爲已接受回答。再次感謝你的幫助! – marcusstarnes 2010-06-15 11:41:24

+0

很高興幫助!正則表達式是我至少要學習的東西之一,然後在下一次我需要對它們做些什麼的時候忘記它。 – Amethi 2010-06-15 20:15:03

2

您需要爲您的正則表達式添加負面查找斷言。 .NET完全支持這一點。

http://www.regular-expressions.info/lookaround.html

負先行斷言,你的模式是不是後面的東西。語法是(?!xxx),其中xxx是定義您不需要的模式。例如,您可以使用(?!\[\/URL\])作爲鏈接。

負向倒映看起來像(?<!xxx)。在這裏,您需要一個模式 - 例如(?<!\[URL=.*?\]) - 但如果需要,您可以使其更加健壯。

+0

所以,把負回顧後在你的正則表達式,並在年底的負先行,和你的模式面前的時候它不會被這些標籤之前或之後將只匹配。 – Jay 2010-06-14 13:46:48

+0

謝謝你的信息周杰倫。 到目前爲止,我已經完成了以下操作,它忽略了[URL =]標記的字符串,它很棒: 正則表達式urlregex = new Regex(@「(?<!\ [URL =。*?\])( http:\/\ /([\ w。] + \ /?)\ S *)(?!\ [\/URL \])「,RegexOptions.IgnoreCase | RegexOptions.Compiled); 不過,我也需要應用一些額外的代碼忽略定製[IMG] ...標記文本和[EMAIL = ...標記文本。 我怎樣才能將這2個納入正則表達式,以便這些定製的標記文本項目也被忽略? 再次感謝您的幫助。 – marcusstarnes 2010-06-14 14:20:41

+0

坦率地說,我更喜歡Amethi的解決方案 - 簡單得多。它類似於它在StackOverflow上的工作原理。您需要創建替代組 - 將選項封裝在parens中,並用管道字符'|'分隔,因此如果您想匹配a,b或c,則可以使用'(a | b | c)'。然而,這會變得很難看,而且我不確定一個非常複雜的正則表達式會比三次更簡單的模式更有效。我會嘗試它作爲三個單獨的正則表達式,只有嘗試組合,如果匹配太慢。 – Jay 2010-06-14 14:46:50

0

周杰倫的權利,雖然你也可以使用這些簡單鏈接匹配正則表達式的,你只需要添加\ b到開始和結束,所以它只匹配周圍沒有東西的鏈接,即你的論壇代碼標籤。

\ b爲字邊界,即空格,句號,逗號等,意味着它是一個獨立的詞,而不是更大的東西的一部分。

我做同樣的事情對我的論壇軟件。我首先解析了論壇代碼,因此它構建了錨定標記,然後我使用這樣的正則表達式尋找它們自己的簡單鏈接並將其轉換。

+0

嗨Amethi。謝謝(你的)信息。這是否會處理作爲帖子中第一項文本(即之前沒有空格)或新行開始處的地址? 如果是這樣,語法如何應用於我現有的純鏈接匹配正則表達式?例如。正則表達式urlregex = new Regex(@「(http:\/\ /([\ w。] + \ /?)\ S *)」,RegexOptions.IgnoreCase | RegexOptions.Compiled); 謝謝。 – marcusstarnes 2010-06-14 14:31:28

+0

新行是,第一個字符,我不太確定,但如果沒有,您可以在帖子的開頭添加一個空格,然後將其修剪掉。不是一個普通的正則表達式解決方案,但我不是那麼好,他們知道如何在一個時髦的正則表達式中完成這一切。 作爲實現它,它會是這樣的: 新的正則表達式(@ 「\ B(HTTP:\/\ /([\ w] + \ /)\ S *)\ B'」,RegexOptions .IgnoreCase | RegexOptions.Compiled); 但不要在此引用我。你必須將它裝入一個正則表達式測試器(網上有負載,或者有免費軟件可以下載)。哦,單元測試,你會爲這個權利寫一個unit-tet? :) – Amethi 2010-06-14 14:38:59

+0

我剛剛嘗試了您提供的示例,但不幸的是,它仍然匹配我定製的標記文本(例如[URL = http://www...etc] ... [/ URL]):(單位: - 測試,[假裝]是[/假裝]:/ – marcusstarnes 2010-06-14 14:57:38

0

你正在尋找的正則表達式是(?<![EMAIL=\1])(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b)(?!\[\/EMAIL])。至少,這是你需要的電子郵件標籤。您的替換隻需[EMAIL = $ 1] $ 1 [/ EMAIL]。對於其他用戶,您需要用適當的任何內容替換中心組和EMAIL標籤。

測試用例:

[[email protected]] [email protected] [/ EMAIL]:FALSE
[email protected]:TRUE

下.NET正則表達式評估,根據你的標籤。

相關問題