正则表达式用标记替换url

时间:2017-03-10 11:19:27

标签: c# html regex

在html中需要将url替换为标记

仅限http://google3.com:1139http://google6.com:1139

<div>
  <a href="http://google1.com:1139" target="_blank">http://google2.com:1139</a> 
  http://google3.com:1139
</div>
<div>
  <a href="http://google4.com:1139" target="_blank">http://google5.com:1139</a>
  http://google6.com:1139
</div>

必须

<div>
  <a href="http://google1.com:1139" target="_blank">http://google2.com:1139</a> 
  <a href="http://google3.com:1139" target="_blank">http://google3.com:1139</a> 
</div>
<div>
  <a href="http://google4.com:1139" target="_blank">http://google5.com:1139</a>
  <a href="http://google6.com:1139" target="_blank">http://google6.com:1139</a> 
</div>

I found solution

        var result = Regex.Replace("<div><a href=\"http://google1.com:1139\" target=\"_blank\">http://google2.com:1139</a>http://google3.com:1139</div><div><a href=\"http://google4.com:1139\" target=\"_blank\">http://google5.com:1139</a>http://google6.com:1139</div>", 
                                   @"((?<!href=['""]?)(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)",
                                   "<a target='_blank' href='$1'>$1</a>");

但需要替换

  1. http 开头,但现在 href =“http (找到)

  2. 未以

  3. 结尾
    </a>
    
    1. 或跳过
    2. <a ... </a>
      

1 个答案:

答案 0 :(得分:1)

我认为这些要求可以改写如下:

  • <a</a>之间的所有内容都应保持不变(包括href属性值)
  • <a</a>之外的给定模式的任何网址都应包含在锚标记中。

这可以通过搜索两种模式<a.*?</a>和&lt;某些网址&gt;作为替代方案来实现。如果找到第一个模式,则自行替换匹配,如果找到第二个模式,则用包装的URL替换:

Regex.Replace(html,
    @"<a.*?</a>|(?:https?|ftp)://[\w_.-]+:\d+",
    m => m.Value.StartsWith("<") 
        ? m.Value
        : string.Format("<a target='_blank' href='{0}'>{0}</a>", m.Value));

演示:https://ideone.com/Jq1s8y

P.S。

为简洁起见,我简化了URL正则表达式。实际应用可能需要更多扩展模式。