c# - 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 中的文本?
解决方案
在您非常特殊的情况下,我首先会尝试某种基本拆分,前提是始终使用标签“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 解析器。
推荐阅读
- javascript - 使用 XML HttpRequest 更新 innerHTML 后元素高度不会改变
- java - 如何在运行时/不重新启动时将 jar 文件添加到 Apache Storm EXTLIB?
- c# - 如何获取字符的ASCII值
- ms-access - 隐藏和折叠报表中的列
- java - 无法弄清楚如何让 Gradle 找到/加载我的 Main 类
- vulkan - Vulkan:vkCmdBindDescriptorSets、pDynamicOffsets
- java - Java 日期和 MySQL 时间戳时区
- asp.net-core - CORB OpenID Connect /connect/authorize 端点(Identity Server 4)
- excel - VBA 调试,如何一次通过多个循环
- titanium - 如何将颜色设置为 appcelerator 中的开关?