c# - 使链接可点击,除非它们已经在使用 C#

标签 c# asp.net regex

我找到了一些使用正则表达式来检测文本段落内 URL 模式并添加 HTML 代码以使其成为链接的示例。我使用这种方法的问题是,有时,输入段落包含以纯文本编写的 URL(我想将其转换为可点击的),但也包含一些已经具有链接标记的 URL。例如,考虑这一段:

My favourite search engine is http://www.google.com but 
sometimes I also use <a href="http://www.yahoo.com">http://www.yahoo.com</a>

我只想转换 Google 链接,但保留两个 Yahoo 链接。

我所追求的是一个 C# 函数,它使用正则表达式来检测 URL 并进行转换,但它会忽略周围有“A”标记标签或已经在“A”标签内的 URL。

编辑

这是我目前所拥有的:

PostBody = "My favourite search engine is http://www.google.com but sometimes I also use <a href=\"http://www.yahoo.com\">http://www.yahoo.com</a>";
String pattern = @"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern);
System.Text.RegularExpressions.MatchCollection matches = regex.Matches(PostBody);
for (int i = 0; i < matches.Count; i++)
{
  PostBody = PostBody.Replace(matches[i].Value, String.Format("<a href=\"{0}\">{1}</a>", matches[i].Value, matches[i].Value));
}
ltrlPostBody.Text = PostBody;

这是我得到的(为了清楚起见,我将它分成多行):

My favourite search engine is 
<a href="http://www.google.com">http://www.google.com</a> 
but sometimes I also use 
<a href="<a href="<a href="http://www.yahoo.com">http://www.yahoo.com</a>">
<a href="http://www.yahoo.com">http://www.yahoo.com</a></a>">

我只想转换第一个链接(在本例中),因为它还没有成为链接标记的一部分。

最佳答案

您还可以使用 HTML Agility Pack ,这给了你更多的权力(例如你不想逃脱

<script></script>

元素和样式元素:

using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using HtmlAgilityPack;

namespace ConsoleApplication3 {
  class Program {
    static void Main(string[] args) {
      var text = @"My favourite search engine is http://www.google.com but 
sometimes I also use <a href=""http://www.yahoo.com"">http://www.yahoo.com</a>
<div>http://catchme.com</div>
<script>
  var thisCanHurt = 'http://noescape.com';
</script>";
      var doc = new HtmlDocument();
      doc.LoadHtml(text);
      var regex = new Regex(@"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&amp;\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?", RegexOptions.IgnoreCase);
      var nodes = doc.DocumentNode.SelectNodes("//text()");
      foreach (var node in nodes) {
        if (node.ParentNode != null && (node.ParentNode.Name == "a" || node.ParentNode.Name == "script" || node.ParentNode.Name == "style")) {
          continue;
        }
        node.InnerHtml = regex.Replace(node.InnerText, (match) => {
          return string.Format(@"<a href=""{0}"">{0}</a>", match.Value);
        });
      }

      var builder = new StringBuilder(100);
      using (var writer = new StringWriter(builder)) {
        doc.Save(writer);
      }
      var compose = builder.ToString();
    }
  }
}

关于c# - 使链接可点击,除非它们已经在使用 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665759/

相关文章:

c# - 从 ASP.NET Core Web API 中的 Controller 访问用户身份

c# - restclient 是否支持 json-patch?

c# - 如何将我的数据库上下文注入(inject)我所有的存储库类

用于匹配多个实例的 JavaScript 正则表达式

javascript - 使用正则表达式识别和隔离希伯来语单词

c# - ASP.Net 核心 : How do I update (change/add/remove) nested item objects (One-to-Many relationship)?

c# - 在特定情况下自动滚动列表框

jquery - 仅悬停在图像上

c# - 使用 XmlDataSource 时如何在嵌套的 ListView 上设置 ClientIDRowSuffix?

php - preg_match 用于 <?php、<? 和/或 ?>