2012-05-15 16 views
0

試圖獲得一個匹配URL的正則表達式,例如「http://www.test.com」,然後打算把它周圍的錨標記 - 這部分與工作已經關注:C#正則表達式的URL

regex = @"(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:;,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[A-Z0-9+&@#\/%=~_|$])" 
msg = r.Replace(msg, "<a target=\"_blank\" href=\"$0\">$0</a>"); 

但是當在輸入文本圖像標記它誤將錨圖片標籤的src屬性中的標籤,例如

<img src="<a>...</a>" />; 

到目前爲止,我想這繞過:(不工作)

regex = @"(?!(src=""))(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:;,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[A-Z0-9+&@#\/%=~_|$])" 

編輯:

(例如測試輸入):

<p> 
    www.test1.com<br /> 
    <br /> 
    http://www.test2.com<br /> 
    <br /> 
    https://www.test3.com<br /> 
    <br /> 
    &quot;https://www.test4.com<br /> 
    <br /> 
    &#39;https://www.test4.com<br /> 
    <br /> 
    =&quot;https://www.test4.com</p> 
<p> 
    &nbsp;</p> 
<p> 
    <img alt="" src="..." style="width: 500px; height: 375px;" /></p> 

(例如輸出):

<p> 
    <a target="_blank" href="www.test1.com">www.test1.com</a><br /> 
    <br /> 
    <a target="_blank" href="http://www.test2.com">http://www.test2.com</a><br /> 
    <br /> 
    <a target="_blank" href="https://www.test3.com">https://www.test3.com</a><br /> 
    <br /> 
    &quot;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a><br /> 
    <br /> 
    &#39;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a><br /> 
    <br /> 
    =&quot;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a></p> 
<p> 
    &nbsp;</p> 
<p> 
    <img alt="" src="<a target="_blank" href="...">...</a>" style="width: 500px; height: 375px;" /></p> 

(期望輸出):使用正則表達式

<p> 
    <a target="_blank" href="www.test1.com">www.test1.com</a><br /> 
    <br /> 
    <a target="_blank" href="http://www.test2.com">http://www.test2.com</a><br /> 
    <br /> 
    <a target="_blank" href="https://www.test3.com">https://www.test3.com</a><br /> 
    <br /> 
    &quot;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a><br /> 
    <br /> 
    &#39;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a><br /> 
    <br /> 
    =&quot;<a target="_blank" href="https://www.test4.com">https://www.test4.com</a></p> 
<p> 
    &nbsp;</p> 
<p> 
    <img alt="" src="..." style="width: 500px; height: 375px;" /></p> 
+0

這是雲裏霧裏 - 我可以理解你想要的一般但不精確,你能列出5個正確的輸入和5個正確的輸出,並給出2個正確的輸入,這會產生2個不正確的輸出? –

+0

我添加了輸入和輸出我目前正在測試 – John

回答

0

下面是解決這個問題對我來說正則表達式:

String regex = @"(?<!(""|'))((http|https|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:;,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:;,.]*\)|[A-Z0-9+&@#\/%=~_|$])"; 

我用回溯負斷言,以確保該URL沒有開口報價之前

1

處理HTML是在我的opnion錯誤的形式給出。

把那到一邊 - 只需添加這條規則的正則表達式匹配成功後:

如果(regexResult.Count(C =>ç== '/')> 2)regexResult有兩個以上的 '/'字符 這是一個無效的結果;

你可以,如果它解決您的問題這條規則添加到您的正則表達式。

+0

我同意正則表達式不是一個很好的方式來處理html,但它的當前工作解決方案的一部分,我只需要修改一下,不知道如何.Count()會有幫助嗎? – John

+0

由於您在尋找網址如http://www.somthing.ext而不是http:/ /www.somthing.ext/somthing.jpg,它會過濾掉那些有兩個以上斜槓的結果。它也限制你只使用根URL。 –

+0

實際上它可以與具有任意數量的斜線的網址一起使用,自上次發佈以來,我已解決了此問題,我將在下面發佈我的解決方案 – John