.NET библиотека / метод, чтобы исправить и URL-адрес правильно кодировать пробелы - PullRequest
0 голосов
/ 03 мая 2018

ПРИМЕЧАНИЕ : Это относится только к значениям атрибута "href".

1, мне нужен способ отделить протокол (ftp, http, https и т. Д.) И расширение домена (.net, .com, .org, .shop и т. Д.) От пути в C #
< br /> 2, УДАЛИТЬ все пробелы в протоколе.

3, УДАЛИТЬ все пробелы в расширении домена

4, УДАЛИТЬ пробелы справа и слева от пути

5. Замените пробелы в пути на% 20

Источник : href = "somedomain.co m / моя папка / моя страница. 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 / моя папка /"
Вывод : href = "http [s]: //somedomain.com/my%20folder/"
ПРИМЕЧАНИЕ : пробел в «ht tp», после двоеточия «: //», после точки и в пределах расширения домена.. Co m

Источник : href = "somedomain. Com / my folder /"
Вывод : href = "somedomain.com/my%20folder/"

Меня не интересует кодирование чего-либо еще. Все, что я хочу сделать, это удалить ненужные пробелы и кодировать пробелы в пути, чтобы сделать URL действительным. Таким образом, следующие библиотеки бесполезны:

Uri.EscapeDataString
HttpUtility.UrlEncode
Uri.EscapeUriString
HttpUtility.UrlPathEncode

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Следующее регулярное выражение должно сделать это для вас:

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

Замена на "" (пустая строка) в URL-адресах удаляет все ненужные пробелы. Затем просто замените оставшиеся пробелы на %20.

Regex объяснение:

Он состоит из двух чередований:

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

Второй просто соответствует всем пробелам, следующим за частью пути - всем пробелам до / или ..

  • \s+ все пробелы
  • (?=[/.]) смотреть вперед, сопоставляя / или ..

Первый немного сложнее. Он соответствует всем пробелам (окончание \s+), которым предшествует совпадение с положительным взглядом за (?<=[/.]|^([^/]|//)*).

Этот взгляд позади - (?<=[/.]|^([^/]|//)*) - состоит из двух чередований, где первая часть - [/.] - просто соответствует / или ..

Вторая часть - ^([^/]|//)* - соответствует всему URL в начале строки (^), что не является единственным /. (Чередование с // делает двойной слеш при http:// проходе.)

Вкратце это означает, что он соответствует всем пробелам до первой одиночной косой черты в URL. Таким образом, вместе с ранее объясненным чередованием полное регулярное выражение соответствует всем нежелательным пробелам .

Таким образом, оставшиеся пробелы следует просто заменить на %20:)

Иллюстрация того, как исправить пробелы с помощью C #:

Regex.Replace(sURL, @"(?<=/|^([^/]|//)*)\s+|\s+(?=/)", "").Replace(" ", "%20")

И если я вас правильно понимаю, вы также захотите указать протоколы, если таковые имеются (требование 1). Таким образом, после того, как предыдущая операция была сделана, простое совпадение с ^\w+(?=://) должно получить вас. (Совпадение всех символов от начала строки до ://.)

Что касается верхнего домена, подход тот же - извлеките его потом. Но мы используем часть из первого регулярного выражения, чтобы убедиться, что мы получаем только верхний домен, а не расширение файла или что-то подобное. Регулярное выражение (?<=[/.]|^([^/]|//)*)\w+(?=(/|$)) будет соответствовать только символам перед первым синглом /, используя объяснение, описанное ранее. Но на этот раз вместо пробелов мы сопоставляем символы слова - \w, вплоть до / или окончания строки ($). Это дает нам верхний домен.

Проверьте это на ideone .

Извините за искаженные URL-адреса - это идеальный вариант, и я не знаю, как это "отменить", но вот оригинальный код:

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));
        }
    }
}

Выход:

Protocol   Top domain   URL

           com          somedomain.com/my%20folder/my%20page.html 
http       info         http://somedomain.info/my%20folder/ 
https      com          https://somedomain.com/my%20folder/ 
http       com          http://www.somedomain.com/my%20folder/ 
https      info         https://www.somedomain.info/my%20folder/ 
           com          somedomain.com/my%20folder/ 
http       com          http://www.somedomain.com/my%20folder/sub.folder/directory/ 
https      info         https://www.somedomain.info/my%20folder/ 
           com          somedomain.com/my%20folder/ 
           tv           somedomain.tv 
0 голосов
/ 11 мая 2018

Я не собираюсь писать какой-либо код для вас, но я мог бы написать его на C #, если это необходимо.

Итак, это регулярное выражение, чтобы получить то, что вам нужно.

Найти: (?m)^(.+?)((?>//?)(?<!:\s*/\s*/).*?)\s*$
Замена:
Объединить - Убрать пробелы из группы 1 + Заменить пробелы на %20 в группе 2

Демо: Здесь

Читаемый / объясненный

 (?m)                          # Multiline mode
 ^                             # BOL
 ( .+? )                       # (1), Domain, required
 (                             # (2 start), Directory, optional
      (?> //? )                     # Atomic Start /
      (?<! : \s* / \s* / )          # Cannot be :// <--
      .*? 
 )                             # (2 end)
 \s*                           # Trim trailing whitespace
 $                             # EOL
0 голосов
/ 08 мая 2018

Предлагаемое решение:

  1. split string в 2 части с href=\"((?:.*//.*?/)|.*?/) или аналогичным регулярным выражением;
  2. Заменить spaces на nothing в 1-й части ;
  3. Заменить spaces на %20 на 2-й части ;

т.е:.

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/"

Демо

PS: я не .NET эксперт, и я уверен, что regex и демонстрационный код можно (нужно) улучшить (например: try/catch блоки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...