用于正确修复和URL编码空间的.NET库/方法

时间:2018-05-03 17:44:00

标签: .net regex url-rewriting

注意:这仅适用于“href”属性值。

1,我需要一种方法将协议(ftp,http,https等)和域扩展名(.net,.com,.org,。shop等)从C#中的路径分开<登记/> 2,删除协议中的所有空格。

3,删除域扩展名中的所有空格

4,删除路径左右两侧的空格

5,用%20替换路径中的空格 来源:href =“somedomain.co m / my folder / my page.html”
输出:href =“somedomain.com/my%20folder/my%20page.html”

来源:href =“http [s]://somedomain.com/my folder /”
输出:href =“http [s]://somedomain.com/my%20folder/”

来源:href =“ht tp [s]:// www .somedomain.co m / my folder /”
输出:href =“http [s]://somedomain.com/my%20folder/”
注意:“ht tp”中的空格,冒号“://”后,句点之后和域名扩展名“.co m”

来源:href =“somedomain.com / my folder /”
输出:href =“somedomain.com/my%20folder/”

我对编码其他任何东西都不感兴趣。我想要做的就是删除不必要的空格并在路径中编码空格以使URL有效。因此,以下库是没有用的:

 final ArrayAdapter<String> adaptor = new ArrayAdapter<String>(YourActivityName.this,android.R.layout.simple_list_item_1,tables);

2 个答案:

答案 0 :(得分:2)

以下正则表达式应该为您完成:

(?<=[/.]|^([^/]|//)*)\s+|\s+(?=[/.])

用URL中的""(空字符串)替换它会删除所有不需要的空格。然后只需用%20替换剩余的空格。

正则表达式解释:

它由两个替代组成:

  1. (?<=[/.]|^([^/]|//)*)\s+
  2. \s+(?=[/.])
  3. 第二个只是匹配路径部分后面的所有空格 - /.之前的所有空格。

    • \s+所有空格
    • (?=[/.])预先匹配/.

    第一个有点复杂。它匹配所有空格(结尾\s+),前面是匹配(?<=[/.]|^([^/]|//)*)后面的正面外观。

    此后面的展示 - (?<=[/.]|^([^/]|//)*) - 由两个替代项组成,其中第一部分 - [/.] - 只匹配/.

    第二部分 - ^([^/]|//)* - 匹配网址中的所有内容,从该行的开头(^)开始,不是一个 {{1} }。 (与/的交替在//传递中产生双斜线。)

    这意味着简单地说它匹配URL中第一个单个斜杠之前的所有空格。与之前解释的交替一起,完整的正则表达式匹配所有不需要的空格

    因此,剩下的空格应该只用http://替换:)

    如何使用C#修复空格的说明:

    %20

    如果我理解正确,你也想要识别协议,如果有的话(要求1)。因此,在完成上一个操作之后,只需与Regex.Replace(sURL, @"(?<=/|^([^/]|//)*)\s+|\s+(?=/)", "").Replace(" ", "%20") 匹配即可获得这些操作。 (将该行开头的所有字符与^\w+(?=://)匹配。)

    关于顶级域名,方法是相同的 - 之后提取它。但是我们使用第一个正则表达式中的一部分来确保我们只获得顶级域而不是文件扩展名等。正则表达式://将仅使用前面介绍的后面的外观在第一个单(?<=[/.]|^([^/]|//)*)\w+(?=(/|$))之前匹配字符。但是这一次,我们匹配单词字符 - /,最多\w或行终止(/),而不是空格。这为我们提供了顶级域名。

    Check it out at ideone

    对不起乱码的网址 - 这是理所当然的,不知道如何“撤消”,但这是原始代码:

    $

    输出:

    using System;
    using System.Text.RegularExpressions;
    
    public class Test
    {
        public static string CleanURL(string sURL, out string sProtocol, out string sTopDomain)
        {
            string sCleanURL = Regex.Replace(sURL, @"(?<=[/.]|^([^/]|//)*)\s+|\s+(?=[/.])", "").Replace(" ", "%20");
            sProtocol = Regex.Match(sCleanURL, @"^\w+(?=://)").Value;
            sTopDomain = Regex.Match(sCleanURL, @"(?<=[/.]|^([^/]|//)*)\w+(?=(/|$))").Value;
    
            return sCleanURL;
        }
    
        public static void Main()
        {
            string[] listURL = {
                " somed omain.co m/  my folder/my page.  html",
                "http://somedomain.info/my folder  /",
                "https://somedomain.com/my folder/",
                "ht tp: //www .somedomain.  co m/my folder/ ",
                "ht tps: //www .somedomain.  in fo/my folder/ ",
                " somedomain. com/my folder/ ",
                "ht tp: //www .somedomain.  co m/my folder/ sub.folder  / directory  /",
                "ht tps: //www .somedomain.  in fo/my folder/ ",
                " somedomain. com/my folder/ ",
                " somedomain. tv "
                };
    
            // Write header
            Console.WriteLine(string.Format("Protocol   Top domain   URL\n"));
            foreach(string sURL in listURL)
            {
                string sCleanURL, sProtocol, sTopDomain;
    
                sCleanURL = CleanURL( sURL, out sProtocol, out sTopDomain);
    
                Console.WriteLine(string.Format("{0,-9}  {1,-11}  {2} ", sProtocol, sTopDomain, sCleanURL));
            }
        }
    }
    

答案 1 :(得分:1)

建议的解决方案:

  1. split 2部分中的string href=\"((?:.*//.*?/)|.*?/)或类似的正则表达式;
  2. spaces替换为第一部分上的nothing;
  3. spaces替换为第二部分上的%20;
  4. 即:

    using System;
    using  System.Text.RegularExpressions;
    
    public class Program
    {
    
    
        public static void Main()
        {
            string subject = "href=\" somedomain.co m/  my folder/my page.  html\"";
            Console.Write(replaceMe(subject)  + "\n") ;
    
    
            subject = "href=\"http[s]://somedomain.com/my folder/\"";
            Console.Write(replaceMe(subject) + "\n" );
    
    
            subject = "href=\"ht tp[s]: //www .somedomain.  co m/my folder/ \"";
            Console.Write(replaceMe(subject) + "\n" );
    
    
            subject = "href=\" somedomain. com/my folder/ \"";
            Console.Write(replaceMe(subject) + "\n" );
        }
    
    
        public static string replaceMe(string subject){
    
            subject = Regex.Replace(subject, " \"|\" ", "\"");
            string[] splitArray = Regex.Split(subject, "href=\"((?:.*//.*?/)|.*?/)", RegexOptions.IgnoreCase);
            string part_a = Regex.Replace(splitArray[1], @"\s+", "");
            string part_b = Regex.Replace(splitArray[2], @"\s", "%20");
            return ("href=\"" + part_a  +  part_b );    
        }
    }
    

    <强>输出:

    href="somedomain.com/%20%20my%20folder/my%20page.%20%20html"
    href="http[s]://somedomain.com/my%20folder/"
    href="http[s]://www.somedomain.com/my%20folder/"
    href="somedomain.com/my%20folder/"
    

    Demo

    PS:我 .NET专家,我确​​信regex和演示代码可以(应该)改进 (例如:try/catch块)。