Регулярное выражение для поиска URL в строке - PullRequest
67 голосов
/ 18 мая 2011

Кто-нибудь знает регулярное выражение, которое я мог бы использовать, чтобы найти URL-адреса в строке?Я нашел много регулярных выражений в Google для определения, является ли вся строка URL-адресом, но мне нужно иметь возможность искать всю строку по URL-адресам.Например, я хотел бы иметь возможность найти www.google.com и http://yahoo.com в следующей строке:

Hello www.google.com World http://yahoo.com

Я не ищу конкретные URL-адреса в строке.Я ищу ВСЕ URL-адреса в строке, поэтому мне нужно регулярное выражение.

Ответы [ 21 ]

168 голосов
/ 18 мая 2011

Я использую это

(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?

Работает для меня, должно работать и для вас.

28 голосов
/ 27 марта 2015

Не думаю, что регулярное выражение идеально подходит для этого использования.Я нашел довольно солидный здесь

/(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm

Некоторые отличия / преимущества по сравнению с другими, опубликованными здесь:

  • Это не соответствует адресам электронной почты
  • Это соответствует localhost: 12345
  • Он не обнаружит что-то вроде moo.com без http или www

См. здесь для примеров

12 голосов
/ 13 февраля 2018
text = """The link of this question: /5742751/regulyarnoe-vyrazhenie-dlya-poiska-url-v-stroke
Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd
The code below catches all urls in text and returns urls in list."""

urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text)
print(urls)

Выход:

[
    '/5742751/regulyarnoe-vyrazhenie-dlya-poiska-url-v-stroke', 
    'www.google.com', 
    'facebook.com',
    'http://test.com/method?param=wasd'
]
5 голосов
/ 10 декабря 2017

Я думаю, что этот шаблон регулярного выражения обрабатывает именно то, что вы хотите

/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/

, и это пример фрагмента для извлечения URL:

// The Regular Expression filter
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

// The Text you want to filter for urls
$text = "The text you want  /5742751/regulyarnoe-vyrazhenie-dlya-poiska-url-v-stroke to filter goes here.";

// Check if there is a url in the text
preg_match_all($reg_exUrl, $text, $url,$matches);
var_dump($matches);
5 голосов
/ 20 декабря 2016

Ни одно из представленных здесь решений не решило проблемы / варианты использования, которые у меня были.

То, что я здесь предоставил, - лучшее, что я нашел / сделал до сих пор. Я обновлю его, когда найду новые крайние случаи, которые он не обрабатывает.

\b
  #Word cannot begin with special characters
  (?<![@.,%&#-])
  #Protocols are optional, but take them with us if they are present
  (?<protocol>\w{2,10}:\/\/)?
  #Domains have to be of a length of 1 chars or greater
  ((?:\w|\&\#\d{1,5};)[.-]?)+
  #The domain ending has to be between 2 to 15 characters
  (\.([a-z]{2,15})
       #If no domain ending we want a port, only if a protocol is specified
       |(?(protocol)(?:\:\d{1,6})|(?!)))
\b
#Word cannot end with @ (made to catch emails)
(?![@])
#We accept any number of slugs, given we have a char after the slash
(\/)?
#If we have endings like ?=fds include the ending
(?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)?
#The last char cannot be one of these symbols .,?!,- exclude these
(?<![.,?!-])
3 голосов
/ 22 июня 2016

Все приведенные выше ответы не совпадают для символов Юникода в URL, например: http://google.com? Query = đức + filan + đã + search

Для решения, этот должен работать:

(ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*)
2 голосов
/ 18 мая 2011

Если у вас есть шаблон URL, вы сможете найти его в своей строке. Просто убедитесь, что шаблон не имеет ^ и $, отмечающих начало и конец строки URL. Так что, если P является шаблоном для URL, ищите совпадения для P.

2 голосов
/ 12 ноября 2017

Если вам нужно быть строгим при выборе ссылок, я бы выбрал:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

Для получения дополнительной информации прочитайте это:

Улучшенный либеральный, точный шаблон регулярного выражениядля сопоставления URL

1 голос
/ 08 января 2019

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

Regex:

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
1 голос
/ 21 февраля 2019

Я использую это регулярное выражение:

/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig

Он отлично работает для многих URL, например: http://google.com, https://dev -site.io: 8080 / home? Val = 1 & count= 100 , www.regexr.com, localhost: 8080 / путь, ...

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