Подтвердить что ты не робот

Регулярное выражение для поиска URL-адресов внутри строки

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

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

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

4b9b3361

Ответ 1

Это тот, который я использую

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

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

Ответ 2

Guess no regex идеально подходит для этого использования. Я нашел довольно солидный здесь

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

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

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

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

Ответ 3

text = """The link of this question: https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string
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)

Выход:

[
    'https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string', 
    'www.google.com', 
    'facebook.com',
    'http://test.com/method?param=wasd'
]

Ответ 4

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

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

\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
(?<![.,?!-])

Ответ 5

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

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

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

// 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  https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string to filter goes here.";

// Check if there is a url in the text
preg_match_all($reg_exUrl, $text, $url,$matches);
var_dump($matches);

Ответ 6

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

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

(ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*)

Ответ 7

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

Ответ 8

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

(?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-адресов

Ответ 9

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

Regex это:

(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s'!()\[\]{};:'".,<>?«»""‘]))?

Ответ 10

Это небольшое улучшение/корректировка (в зависимости от того, что вам нужно) Rajeev answer:

([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&amp;:/~\+#]*[A-Z\-\@?^=%&amp;/~\+#]){2,6}?

Смотрите здесь для примера того, что он делает и не соответствует.

Я избавился от проверки на "http" и т.д., поскольку я хотел уловить url без этого. Я добавил немного в регулярное выражение, чтобы поймать некоторые запутанные URL-адреса (т.е. Где пользователь использует [точка] вместо "." ). Наконец, я заменил "\ w" на "A-Z" и "{2,3}", чтобы уменьшить ложные срабатывания, такие как v2.0 и "moo.0dd".

Любые улучшения в этом приветствии.

Ответ 11

Я использовал ниже регулярное выражение, чтобы найти url в строке:

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

Ответ 12

Короче и просто. Я еще не тестировал код javascript, но, похоже, он будет работать:

((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))

Код на regex101.com

Предварительный просмотр кода

Ответ 13

Я использовал это

^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$

Ответ 14

Вероятно, слишком упрощенный, но рабочий метод может быть:

[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+

Я тестировал его на Python и до тех пор, пока синтаксический анализ строки содержит пробел до и после, и ни один из URL-адресов (который я никогда не видел раньше), это должно быть хорошо.

Вот онлайн-демон, демонстрирующий это

Однако вот некоторые преимущества его использования:

  • Он распознает file: и localhost а также ip-адреса
  • Он никогда не будет соответствовать без них
  • Это не против необычных символов, таких как # или - (см. Url этого сообщения)

Ответ 15

Это самый простой. которые работают для меня хорошо.

%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%

Ответ 16

Использование регулярного выражения, предоставленного @JustinLevene, не имело правильных escape-последовательностей на обратных косых чертах. Обновлен и теперь корректен и добавлен в состояние, соответствующее протоколу FTP: будет соответствовать всем URL-адресам с протоколами или без них и без использования "www".

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

Пример: https://regex101.com/r/uQ9aL4/65

Ответ 17

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

/((\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/path,...

Ответ 18

На случай, если кому-то понадобится регулярное выражение с обнаружением URL-адресов, подобных этим:

  1. https://www.youtube.com/watch?v=38XmKNcgjSU
  2. https://www.youtube.com/
  3. www.youtube.com
  4. youtube.com...

Я придумал это регулярное выражение:

((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)

Ответ 19

Я использую логику поиска текста между двумя точками или периодами

regex ниже работает отлично с python

(?<=\.)[^}]*(?=\.)

Ответ 20

Это лучший вариант.

NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)‌​+))([\\w.,@?^=%&:/~+#-]*[\\[email protected]?^=%&/~+#-])?";

Ответ 21

Соответствие URL-адреса в тексте не должно быть настолько сложным

(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)

https://regex101.com/r/wewpP1/2

Ответ 22

String regex = "[a-zA-Z0-9]+[.]([.a-zA-Z0-9])+";

Это хорошо работает и в вашем случае.