首页 > 解决方案 > C# 替换字符串中的某个单词,除了任何 url

问题描述

我有一个很大的字符串值,我试图找到在不更改 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 中的文本?

标签: c#

解决方案


在您非常特殊的情况下,我首先会尝试某种基本拆分,前提是始终使用标签“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 解析器。


推荐阅读