0

试图获得一个匹配 url 的正则表达式,例如“http://www.test.com”,然后在它周围放置锚标签 - 该部分已经在使用以下内容:

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>
4

2 回答 2

1

在我看来,使用正则表达式处理 HTML 是一种错误的方法。

把它放在一边 - 只需在您的正则表达式匹配成功后添加该规则:

if(regexResult.Count(c => c == '/') > 2) regexResult 有两个以上的 '/' 字符,这是一个无效的结果;

如果它解决了您的问题,您可以将此规则添加到您的正则表达式模式中。

于 2012-05-15T09:21:52.243 回答
0

这是为我解决问题的正则表达式:

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

我使用了回溯否定断言来确保 url 之前没有开引号

于 2012-05-17T05:46:27.727 回答