2017-01-17 2 views
0

Что не так с этим кодом? Моя цель - найти URL-адреса в тексте и поместить их в теги гиперссылок. Я использую старое регулярное выражение diegoperini (кредиты https://mathiasbynens.be/demo/url-regex). Все идет хорошо, если мой вход - одна строка и без пробела в конце.Проблема с несколькими линиями и пробелами в C# только

https://regex101.com/ страница показывает, что это регулярное выражение действительно (глобально и многократно проверено), но C# ничего не находит.

class Program 
    { 
     static void Main(string[] args) 
     { 
      String sourcestring = @"Tralala 

bla bla bla 

https://iqesonline.lt/index.cfm 
bla bla bla bla 
https://iqesonline.lt/index.cfm?id=99061c04-441e-a138-8254-6c441f7f59b5 

ulala. 

trampampam"; 
      // WORKS sourcestring = "https://iqesonline.lt/index.cfm?id=98061c04-441e-a138-8254-6c441f7f59b5"; 
      // DOES NOT WORK sourcestring = "https://iqesonline.lt/index.cfm?id=98061c04-441e-a138-8254-6c441f7f59b5 "; 
      ParseLinksToHtml(sourcestring); 


     } 
     public static string ParseLinksToHtml(string tekstas) 
     { 

      string result = tekstas; 
      if (!string.IsNullOrEmpty(result)) 
      { 
       // NOT WORKING Regex rx = new Regex(@"^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$"); 
       //NOT WORKING TOO 
       Regex rx = new Regex(@"^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$", RegexOptions.Multiline | RegexOptions.IgnoreCase); 
       result = rx.Replace(result, delegate (Match match) 
       { 
        string url = match.ToString(); 
        if (url.ToLower().StartsWith("www.")) 
        { 
         url = "http://" + url; 
        } 
        return string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>", url, match.ToString()); 
       }); 
      } 
      return result; 
     } 


    } 
+0

Почему не https: // [^ \ s] * | FTP: // [^ \ s] * – jdweng

+1

попробуйте удалить "^" в начале и "$" в конце вашего шаблона – Magnetron

ответ

0

опробованный работает со следующей упрощенной строкой регулярного выражения:

@"(?:\w+):\/\/(?:[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*"

Производит:

Tralala 

bla bla bla 

<a href="https://iqesonline.lt/index.cfm" target="_blank">https://iqesonline.lt/index.cfm</a> 
bla bla bla bla 
<a href="https://iqesonline.lt/index.cfm?id=99061c04-441e-a138-8254-6c441f7f59b5" target="_blank">https://iqesonline.lt/index.cfm?id=99061c04-441e-a138-8254-6c441f7f59b5</a> 

ulala. 

trampampam 
+0

Это регулярное выражение не работает на "httttttttts: // .....". Он показывает, что он действителен url –

+0

Чья сказать, что 'httttttttts: //' не является допустимым протоколом? –

0

Правильного ответ: Удаление "^" и "$" сделали работу , Ответ принадлежит Магнетрону. Спасибо.

Regex rx = new Regex(@"^(?:(?:https?|ftp)://)(?:\S+(?::\S*)[email protected])?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$", RegexOptions.Multiline | RegexOptions.IgnoreCase); 
Смежные вопросы