2

在 C# 后面的代码中,我有以下代码。如何更改替换,以便只替换第一次出现的 www?例如,如果用户输入 www.testwww.com,那么我应该将其保存为 testwww.com。目前按照下面的代码,它保存为 www.com(猜测是由于 substr 代码)。请帮忙。提前致谢。

private string FilterUrl(string url)
    {
        string lowerCaseUrl = url.ToLower();
        lowerCaseUrl = lowerCaseUrl.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty);
        lowerCaseUrl = lowerCaseUrl.Replace("www.", string.Empty);

        string lCaseUrl = url.Substring(url.Length - lowerCaseUrl.Length, lowerCaseUrl.Length);
        return lCaseUrl; 
    }
4

5 回答 5

3

正如艾莉建议的那样。你最好使用System.Uri. 这也可以根据需要替换领先的 www。

private string FilterUrl(string url)
{
    Uri uri = new UriBuilder(url).Uri; // defaults to http:// if missing
    return Regex.Replace(uri.Host, "^www.", "") + uri.PathAndQuery;
}

编辑:尾部斜杠是因为 PathAndQuery 属性。如果没有路径,则只剩下斜杠。只需添加另一个正则表达式替换或字符串替换。这是正则表达式的方式。

return Regex.Replace(uri.Host, "^www.", "") + Regex.Replace(uri.PathAndQuery, "/$", "");
于 2012-12-07T19:41:33.533 回答
0

Replace方法将更改字符串的所有内容。您必须使用方法找到要删除的部分IndexOf,并使用Remove字符串的方法删除。尝试这样的事情:

//include the namespace
using System.Globalization;


private string FilterUrl(string url)
{
    // ccreate a Comparer object.
    CompareInfo myCompare = CultureInfo.InvariantCulture.CompareInfo;

    // find the 'www.' on the url parameter ignoring the case.
    int position = myCompare.IndexOf(url, "www.", CompareOptions.IgnoreCase);

    // check if exists 'www.'  on the string.
    if (position > -1)
    {
      if (position > 0)
         url = url.Remove(position - 1, 5);
      else
         url = url.Remove(position, 5);
    }

    //if you want to remove http://, https://, ftp://.. keep this line
    url = url.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty);

    return url;
}   

编辑

您的代码中有一部分正在删除一段字符串。如果您只想删除“www.” 和'http://'、'https://'、'ftp://',看看这段代码。

此代码在比较 url 参数和您所找到的内容时也会忽略大小写,例如“www.”。

于 2012-12-07T19:34:58.583 回答
0

我建议使用 indexOf(string) 来查找第一个匹配项。

编辑:好吧,有人打败了我;)

于 2012-12-07T19:35:37.410 回答
0

您可以像 Felipe 建议的那样使用 IndexOf 或以低技术的方式进行操作。

 lowerCaseUrl = lowerCaseUrl.Replace("http://", string.Empty).Replace("https://", string.Empty).Replace("ftp://", string.Empty).Replace("http://www.", string.Empty).Replace("https://www.", string.Empty)

有兴趣知道您要达到的目标。

于 2012-12-07T19:39:20.657 回答
0

想出了一个很酷的静态方法,也适用于替换前 x 次出现:

public static string ReplaceOnce(this string s, string replace, string with)
{
    return s.ReplaceCount(replace, with);
}

public static string ReplaceCount(this string s, string replace, string with, int howManytimes = 1)
{
    if (howManytimes < 0) throw InvalidOperationException("can not replace a string less than zero times");
    int count = 0;
    while (s.Contains(replace) && count < howManytimes)
    {
        int position = s.IndexOf(replace);
        s = s.Remove(position, replace.Length);
        s = s.Insert(position, with);
        count++;
    }
    return s;
}

ReplaceOnce不是必需的,只是一个简化器。像这样称呼它:

string url = "http://www.stackoverflow.com/questions/www/www";

var urlR1 - url.ReplaceOnce("www", "xxx");
// urlR1 = "http://xxx.stackoverflow.com/questions/www/www";


var urlR2 - url.ReplaceCount("www", "xxx", 2);
// urlR2 = "http://xxx.stackoverflow.com/questions/xxx/www";

注意:这是区分大小写的,因为它是写的

于 2012-12-07T19:45:28.850 回答