Регулярное выражение для поиска URL-адресов внутри строки
Кто-нибудь знает о регулярном выражении, которое я мог бы использовать для поиска URL-адресов внутри строки? Я нашел много регулярных выражений в Google для определения того, является ли целая строка URL-адресом, но мне нужно иметь возможность искать целую строку для URL-адресов. Например, я хотел бы найти www.google.com
и http://yahoo.com
в следующей строке:
Hello www.google.com World http://yahoo.com
Я не ищу конкретные URL-адреса в строке. Я ищу ВСЕ URL-адреса в строке, поэтому мне нужно регулярное выражение.
- Кодировка URL-адресов Java для параметров строки запроса
- Как получить идентификатор fragmentа (значение после hashа #) из URL-адреса?
- Как я могу получить целевой URL для события onbeforeunload?
- Что такое хорошие экстракторы ссылок?
- Изменение URL адресной строки в приложении AJAX для соответствия текущему состоянию
- Получить доменное имя из заданного URL-адреса
- Как запретить Firefox скрывать префикс URL http: //?
- Как получить RouteData по URL?
- Как проверить, является ли строка допустимым URL-адресом HTTP?
- Проверьте, существует ли файл на удаленном сервере, используя его URL
- Почему URL-адреса в пространствах имен XML?
- Как построить относительный путь в Java из двух абсолютных путей (или URL-адресов)?
- Активная ссылка URL-адреса Android в TextView
Это тот, который я использую
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?
Работает для меня, должен работать и на вас.
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
См. Здесь примеры
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' ]
Ни одно из решений, представленных здесь, не разрешило проблемы / варианты использования, которые у меня были.
То, что я здесь предоставил, – это лучшее, что я нашел / сделал до сих пор. Я обновлю его, когда найду новые кромки, которые он не обрабатывает.
\b #Word cannot begin with special characters (?\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 (\.([az]{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 (?
Если у вас есть шаблон url, вы сможете найти его в своей строке. Просто убедитесь, что у шаблона нет ^
и $
marking начало и конец строки url. Поэтому, если P является шаблоном для URL-адреса, найдите совпадения для P.
Все приведенные выше ответы не соответствуют символам Юникода в 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*)
Я думаю, что этот шаблон регулярного выражения обрабатывает именно то, что вы хотите
/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
и это пример fragmentа для извлечения 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);
Это небольшое улучшение / корректировка (в зависимости от того, что вам нужно). Ответ Раджива:
([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[AZ\-_]+)+))([AZ\-\.,@?^=%&:/~\+#]*[AZ\-\@?^=%&/~\+#]){2,6}?
См. Здесь пример того, что он делает и не соответствует.
Я избавился от проверки на «http» и т. Д., Поскольку я хотел уловить URL без этого. Я немного добавил к регулярному выражению, чтобы поймать некоторые запутанные URL-адреса (то есть, когда пользователь использует [точка] вместо «.»). Наконец, я заменил «\ w» на «AZ» и «{2,3}», чтобы уменьшить ложные срабатывания, такие как v2.0 и «moo.0dd».
Любые улучшения в этом приветствии.
Короткие и простые. Я еще не тестировал код javascript, но, похоже, он будет работать:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
Код на regex101.com
Если вы должны быть строгими при выборе ссылок, я бы пошел:
(?i)\b((?:[az][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”'']))
Для получения дополнительной информации прочтите следующее:
Улучшенный либеральный, точный шаблон регулярных выражений для сопоставления URL-адресов
Я использовал это
^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$
Вероятно, слишком упрощенный, но рабочий метод может быть:
[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+
Я тестировал его на Python и до тех пор, пока синтаксический анализ строки содержит пробел до и после, и ни один из URL-адресов (который я никогда не видел раньше), это должно быть хорошо.
Вот онлайн-демон, демонстрирующий это
Однако вот некоторые преимущества его использования:
- Он распознает
file:
иlocalhost
а также ip-адреса - Он никогда не будет соответствовать без них
- Это не против необычных символов, таких как
#
или-
(см. Url этого сообщения)
Я использовал ниже регулярное выражение, чтобы найти url в строке:
/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
Это самый простой. которые работают для меня хорошо.
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[az]*%
Я использую логику нахождения текста между двумя точками или периодами
регулярное выражение ниже отлично работает с python
(?<=\.)[^}]*(?=\.)
Это лучший.
NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\[email protected]?^=%&/~+#-])?";
Соответствие URL-адреса в тексте не должно быть настолько сложным
(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)
String regex = "[a-zA-Z0-9]+[.]([.a-zA-Z0-9])+";
Это хорошо работает и в вашем случае.