【问题标题】:C# replace a certain word in string except for any urlsC# 替换字符串中的某个单词,除了任何 url
【发布时间】:2021-04-13 10:04:06
【问题描述】:

我有一个很大的字符串值,我正在尝试找到在不更改 URL 中的任何值的情况下替换某个文本值的最佳方法。

例如,假设我想用“hello”替换单词“google”。我有一个大字符串值,其中包含多个“hi”实例和字符串值“https://www.google.com”中的 url(这只是一个示例)。替换这些值的最佳途径是什么,可能是对字符串的拆分、正则表达式或替换?

目前我有这样的事情:

var data = "<h1>google this is a sample text</h1><p> more text will go here so, google. <a href='https://google.com'> Link here </a>";
var test = "";
if(data.Contains("google")){
   test = data.Replace("google", "hello");
}
// for case sensitivity
if(data.Contains("Google")){
   test = data.Replace("Google", "hello");
}

有没有更好的替代方法,有没有办法不替换 url 中的文本?

【问题讨论】:

  • regex 可能可以在这里解决问题。
  • 你的输入字符串是什么样子的? “单词”和 URL 之间是否有空格或任何其他分隔符?
  • 你能给不同类型的输入字符串举个例子吗
  • 现在我将在输入字符串中添加更多细节,但实际上它看起来像 html
  • 你总是要解析 HTML 吗?因为如果是这样,我建议使用类似HtmlAgilityPack 和使用this Q&A 来获取正文的文本,然后使用this Q&A 替换您想要的字符串,忽略大小写

标签: c#


【解决方案1】:

在您非常特殊的情况下,我会首先尝试某种基本拆分,前提是始终使用标签“a”并且仅用于插入 URL

   private string ReplaceNonUrl_Split(string bigString, string[] substringsToReplace, string[] newStrings)
        {
            string[] Parts = bigString.Split(new string[] { "<a", "</a>" }, StringSplitOptions.None);

            for(int i=0; i<Parts.Length; i++)
            {
                if (Parts[i].Contains("href="))
                {
                    string[] subParts = Parts[i].Split(new string[] { ">" }, StringSplitOptions.None);
                    for (int j = 1; j < subParts.Length; j++)
                    {
                        for (int k = 0; k < newStrings.Length; k++)
                            subParts[j] = subParts[j].Replace(substringsToReplace[k], newStrings[k]);
                    }

                    Parts[i] = string.Join(">", subParts);
                }
                else
                {
                    for (int k = 0; k < newStrings.Length; k++)
                        Parts[i] = Parts[i].Replace(substringsToReplace[k], newStrings[k]);
                }
            }

            string ReplacedString= Parts[0];          
            bool startingURL = true;
            for(int i= 1; i< Parts.Length; i++)
            {
                if (startingURL)
                    ReplacedString += "<a" + Parts[i];
                else
                    ReplacedString += "</a>" + Parts[i];

                startingURL = !startingURL;
            }

            return ReplacedString;
        }

然后调用:

   string replacedString = ReplaceNonUrl_Split(data, new string[] { "google", "Google" }, new string[] { "hello", "Hello" });

免责声明 这只是一个非常手动的选项。当然,已经有一些库可以更好、更有效地为您执行此操作,因此我建议您先查看可能适合您的现有 html 解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多