1

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

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

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

4

5 回答 5

13

如果您正在处理 uris,您可能想要使用,UriBuilder因为对 URIs 之类的结构化数据进行字符串替换不是一个好主意。

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();
});
于 2013-07-30T20:55:00.037 回答
11

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

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

但是,如果您想最小化更改的数量并且可以通过索引访问字符串,您可以遍历集合:

for(int i = 0; i < links.Length; i++ )
{
    links[i] = links[i].Replace("http://","https://");
}
于 2013-07-30T20:55:14.443 回答
1

根据您当前的代码,link不会替换为您想要的任何内容,因为它是只读的(请参阅此处:为什么我不能在 foreach 中修改循环变量?)。改为使用for

for(int a = 0; a < links.Length; a++ )
{
    links[a] = links[a].Replace("http:/","https:/")
}
于 2013-07-30T20:54:55.593 回答
1

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;
}
于 2018-03-27T10:22:07.363 回答
0

使用string.Replace和一些 LINQ:

var httpsLinks = links.Select(l=>l.Replace("http://", "https://");
于 2013-07-30T20:52:53.197 回答