【问题标题】:How to replace "http:" with "https:" in a string with C#?如何用 C# 将字符串中的“http:”替换为“https:”?
【发布时间】:2013-07-30 20:51:25
【问题描述】:

我已经用“http://”存储了我的应用程序中的所有 URL - 我现在需要检查并用“https:”替换所有 URL。现在我有:

    foreach (var link in links)
        {
            if (link.Contains("http:"))
            {
                /// do something, slice or replace or what?
            }
        }

我只是不确定更新字符串的最佳方法是什么。如何才能做到这一点?

【问题讨论】:

  • google 是你的朋友:试试C# Replace string
  • 神圣的反对票...我试过谷歌搜索!
  • 我没有投反对票,只是为了清楚。
  • 我做到了。抱歉,伙计,但是一个非常快速和简单的谷歌搜索显示了海量的结果,包括你可能需要的所有示例,这不是一个晦涩的主题。

标签: c#


【解决方案1】:

如果您正在处理 uri,您可能希望使用 UriBuilder,因为对 URI 等结构化数据进行字符串替换不是一个好主意。

var builder = new UriBuilder(link);
builder.Scheme = "https";
Uri modified = builder.Uri;

不清楚links的类型是什么,但是你可以使用linq用修改后的uri创建一个新集合:

IEnumerable<string> updated = links.Select(link => {
    var builder = new UriBuilder(link);
    builder.Scheme = "https";
    return builder.ToString();
});

【讨论】:

  • 你打败了我——我也想说同样的话。问题实际上是在询问如何更改 URL 的方案,虽然字符串替换可能是安全的,但这是实现目标的更好方法。
  • 您还可以使用对象初始化程序将UriBuilder 创建为表达式而不是语句。例如,这将允许您使用查询表达式:var updated = from link in links select new UriBuilder(link) { Scheme = "https" }.ToString();
  • @ranieuwe 非常正确。最简单的解决方案:在 (!) 将方案更改为 https 之后设置 builder.Port=-1。这将删除端口 80 信息,并使用默认的 https 端口。
【解决方案2】:

问题是您的字符串在一个集合中,并且由于字符串是不可变的,您无法直接更改它们。由于您没有指定links (List?Array?) 的类型,因此正确答案会略有变化。最简单的方法是创建一个新列表:

links = links.Select(link => link.Replace("http://","https://")).ToList();

但是,如果您想最大限度地减少更改次数并且可以按索引访问字符串,您可以循环遍历集合:

for(int i = 0; i < links.Length; i++ )
{
    links[i] = links[i].Replace("http://","https://");
}

【讨论】:

  • 最佳答案,因为 linq
  • @DStanley 我真的想说这个答案是最好的(完全没有神圣),如果你觉得被冒犯了很抱歉
【解决方案3】:

根据您当前的代码,link 不会被替换为您想要的任何内容,因为它是只读的(参见此处:Why can't I modify the loop variable in a foreach?)。改为使用for

for(int a = 0; a < links.Length; a++ )
{
    links[a] = links[a].Replace("http:/","https:/")
}

【讨论】:

    【解决方案4】:

    http://myserver.xom/login.aspx?returnurl=http%3a%2f%2fmyserver.xom%2fmyaccount.aspx&q1=a%20b%20c&q2=c%2b%2b

    在查询字符串部分也有 url 的 url 怎么样?我认为我们也应该更换它们。由于 url 编码转义,这是工作的难点。

    private void BlaBla()
    {
        // call the replacing function
        Uri myNewUrl = ConvertHttpToHttps(myOriginalUrl);
    }
    
    private Uri ConvertHttpToHttps(Uri originalUri)
    {
        Uri result = null;
        int httpsPort = 443;// if needed assign your own value or implement it as parametric 
    
        string resultQuery = string.Empty;
        NameValueCollection urlParameters = HttpUtility.ParseQueryString(originalUri.Query);
    
        if (urlParameters != null && urlParameters.Count > 0)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string key in urlParameters)
            {
                if (sb.Length > 0)
                    sb.Append("&");
    
                string value = urlParameters[key].Replace("http://", "https://");
                string valuEscaped = Uri.EscapeDataString(value);// this is important
                sb.Append(string.Concat(key, "=", valuEscaped));
            }
            resultQuery = sb.ToString();
        }
    
        UriBuilder resultBuilder = new UriBuilder("https", originalUri.Host, httpsPort, originalUri.AbsolutePath);
        resultBuilder.Query = resultQuery;
    
        result = resultBuilder.Uri;
        return result;
    }
    

    【讨论】:

      【解决方案5】:

      使用 string.Replace 和一些 LINQ:

      var httpsLinks = links.Select(l=>l.Replace("http://", "https://");
      

      【讨论】:

      • link 是集合的一个元素;该集合不会看到更改。
      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2018-09-15
      • 2021-06-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多