Ответ 1
Это тот, который я использую
(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?
Работает для меня, должен работать и для вас.
Кто-нибудь знает о регулярном выражении, которое я мог бы использовать для поиска URL-адресов внутри строки? Я нашел много регулярных выражений в Google для определения того, является ли целая строка URL-адресом, но мне нужно иметь возможность искать целую строку для URL-адресов. Например, я хотел бы найти www.google.com
и http://yahoo.com
в следующей строке:
Hello www.google.com World http://yahoo.com
Я не ищу конкретные URL-адреса в строке. Я ищу ВСЕ URL-адреса в строке, поэтому мне нужно регулярное выражение.
Это тот, который я использую
(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
Некоторые отличия/преимущества по сравнению с другими, размещенными здесь:
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
(?<![@.,%&#-])
#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
(?<![.,?!-])
Я думаю, что этот шаблон регулярного выражения обрабатывает именно то, что вы хотите
/(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);
Все приведенные выше ответы не соответствуют символам Юникода в URL, например: http://google.com?query=đức+filan+đã + поиск
Для решения это должно работать:
(ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*)
Если у вас есть шаблон url, вы должны иметь возможность искать его в своей строке. Просто убедитесь, что у шаблона нет меток ^
и $
начала и конца строки url. Поэтому, если P является шаблоном для URL-адреса, найдите совпадения для P.
Если вам нужно быть строгим при выборе ссылок, я бы пошел за:
(?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-адресов
Я нашел это, которое охватывает большинство примеров ссылок, включая части подкаталогов.
Regex это:
(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s'!()\[\]{};:'".,<>?«»""‘]))?
Это небольшое улучшение/корректировка (в зависимости от того, что вам нужно) Rajeev answer:
([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:/~\+#]*[A-Z\-\@?^=%&/~\+#]){2,6}?
Смотрите здесь для примера того, что он делает и не соответствует.
Я избавился от проверки на "http" и т.д., поскольку я хотел уловить url без этого. Я добавил немного в регулярное выражение, чтобы поймать некоторые запутанные URL-адреса (т.е. Где пользователь использует [точка] вместо "." ). Наконец, я заменил "\ w" на "A-Z" и "{2,3}", чтобы уменьшить ложные срабатывания, такие как v2.0 и "moo.0dd".
Любые улучшения в этом приветствии.
Я использовал ниже регулярное выражение, чтобы найти url в строке:
/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
Короче и просто. Я еще не тестировал код javascript, но, похоже, он будет работать:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
Я использовал это
^(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 этого сообщения)Это самый простой. которые работают для меня хорошо.
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
Использование регулярного выражения, предоставленного @JustinLevene, не имело правильных escape-последовательностей на обратных косых чертах. Обновлен и теперь корректен и добавлен в состояние, соответствующее протоколу FTP: будет соответствовать всем URL-адресам с протоколами или без них и без использования "www".
Код: ^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\[email protected]?^=%&\/~+#-])?
Пример: https://regex101.com/r/uQ9aL4/65
Я использую это регулярное выражение:
/((\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,...
На случай, если кому-то понадобится регулярное выражение с обнаружением URL-адресов, подобных этим:
Я придумал это регулярное выражение:
((http(s)?://)?([\w-]+\.)+[\w-]+[.com]+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)
Я использую логику поиска текста между двумя точками или периодами
regex ниже работает отлично с 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])+";
Это хорошо работает и в вашем случае.