【问题标题】:How do I convert text to hyperlinks in C#?如何在 C# 中将文本转换为超链接?
【发布时间】:2011-02-28 14:13:40
【问题描述】:

我对 C# 和 ASP.NET 开发非常陌生。

我想做的是查找和替换出现在网页正文中的某些单词。每次正文中出现某个词时,我都想将该词转换为链接到我们网站上另一个页面的超链接。

我什至不知道从哪里开始。我找到了在 C# 中进行查找和替换的代码,但我没有找到任何帮助来阅读文档、查找某些字符串并将它们更改为不同的字符串。

【问题讨论】:

  • 那么,您想在运行时执行此操作吗?
  • 我有一个问题是正文来自哪里?如果它来自数据库,那么您可以通过简单的扩展方法运行它。如果它是页面上的静态文本,您将需要一个不同的计划。
  • 它是静态的。它被硬编码到页面中,网站后面没有数据库。

标签: c# asp.net regex replace


【解决方案1】:

有几种方法可以做到这一点。

string text = "We the People of the United States, in Order to form a more perfect Union, establish Justice, insure domestic Tranquility, provide for the common defence, promote the general Welfare, and secure the Blessings of Liberty to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America.";

string augmentedText = text.Replace("provide", "<a href='#provide'>provide</a>");

您也可以使用正则表达式来完成此操作。

这是一个将每个单词转换为大写的示例:

public static string MatchEval(Match m)
{
    return m.ToString().ToUpper();
}

static void Main(string[] args)
{
    string text = "This is some sample text.";

    Console.WriteLine(text);

    string result = Regex.Replace(text, @"\w+", new MatchEvaluator(MatchEval));

    Console.WriteLine(result);
}

希望这会有所帮助......祝你好运!

【讨论】:

  • 没有真正需要运行正则表达式来简单地用另一个词或短语替换。似乎有很多开销,而 .Replace 没有任何好处。这个问题还不够清楚,无法决定。 +1序言! :D
  • 另外,如果有要替换的单词列表,最好使用 Linq,尤其是 .Aggregate() 方法。
【解决方案2】:

在文档中查找单词或文本的最佳工作是使用正则表达式。如果您不熟悉这些,如果您打算使您的项目高效,我肯定会建议您完成它。

您可能还想在互联网上搜索 Wiki API,这将帮助您构建您的解决方案,而您不必重新发明温水。

我很确定下面的链接可以让您在学习正则表达式方面占得先机。下载表情测试器,试一试。

http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx

【讨论】:

  • 不客气。我一直认为自己学习一些东西比像空头猴子一样复制/粘贴代码要好。
  • 好吧,我不想复制粘贴,但我的时间很紧,截止日期很紧,我是一名 PHP 开发人员,基本上在一周内努力学习有关 .NET 的所有内容,所以你能给我的任何帮助都会很棒。
  • 继续在这里发布您的问题,我们会看看我们能为您做些什么;-)
【解决方案3】:

看起来您要做的是制作一个打开文件并查看源代码的 c# 应用程序。

您可能需要使用正则表达式来获得要替换的文本的最佳匹配,在编写此代码时还需要小心以确保它只替换整个单词,例如,如果您想创建一个链接对于将您带到 toms 页面的单词 tom,您不希望它在明天等单词中创建链接。

基本上我认为逻辑是找到前后有空格的单词并将其替换为超链接的代码。

第一次看正则表达式时可能会有点吓人,但一旦你有了表达式,它就是执行这种事情的一种非常强大的方式。

【讨论】:

  • 谢谢我一定要去看看正则表达式!我什至没有想过错误地替换其他单词的部分内容!
  • 我可能提出的另一个建议是,如果您要使用它来更新文件,请让您的应用程序首先将原始副本转储到另一个目录中,以防万一。
【解决方案4】:

如果你有一些特定的词,我们一般会使用一些特殊的文字,比如[NAME],[CLASS]来识别文字,然后做如下,

  1. 使用 textreader 类读取 html、aspx 文件。
  2. 将整个文本保存在一个字符串中并开始字符串 .replace("[Name]",@"...") ... 将是必需的属性,
  3. 将文本重新写入具有相同扩展名的新页面。

【讨论】:

  • 我不推荐这种解决方案,因为它需要处理器时间来计算整个字符串,更不用说在变量中保存 10 页长度的文本非常消耗内存。此外,如果需要在文本中替换一个新词,则需要再次搜索整个文本,并将其写入另一个页面。
  • 是的,这似乎有点消耗内存。我应该提到,每个页面上都会有许多不同的关键字,因此对于每个关键字,这个过程必须一次又一次地发生——每页几十次,针对几十个不同的词。此外,我们的大多数页面都非常冗长且文字繁多。
  • 那么正则表达式就是要走的路。另外,如上所述,在 Wiki 上进行一些查找。
【解决方案5】:

好的,Emily,在你的短期限内帮助你一点:

阅读以下文章,了解如何在代码隐藏中获取正文 html 内容: http://west-wind.com/weblog/posts/481.aspx

假设您将 Render() 输出存储在名为 _pageContent 的变量中

我现在使用任何正则表达式,因为我没有时间正确地思考一个。你可以自己玩一下。以下链接可能会为您指明方向:Regex to match multiple strings

public static void ChangeWordsToLinks()
{
  Dictionary<string, string> _wordLinkCollection = new Dicationary<string, string>();
  // fill the collection which will replace words by links here
  // Additionally you can fetch this from a database and loop 
  // through a DataTable to fill this collection
  _wordLinkCollection.add("foo", "http://www.foobar.com");
  _wordLinkCollection.add("bar", "http://www.barfoo.com");

  // this is lazy code and SHOULD be optimized to a single RegExp string.
  foreach(KayValuePair<string, string> pair in _wordLinkCollection)
  {
    _pageContent.Replace(String.Format(" {0} ", pair.Key), 
        String.Format("<a href='{0}'>{1}</a>", pair.Value, pair.Key));
  }
}

很高兴能帮到你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2017-08-07
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多