Учитывая URL-адрес (одна строка):
http://test.example.com/dir/subdir/file.html
Как с помощью регулярных выражений извлечь следующие части:
- Поддомен (тест)
- Домен (example.com)
- Путь без файла (/ dir / subdir /)
- Файл (file.html)
- Путь к файлу (/dir/subdir/file.html)
- URL без пути ( http://test.example.com )
- (добавьте любое другое, что, по вашему мнению, будет полезно)
Регулярное выражение должно работать правильно, даже если я введу следующий URL:
http://example.example.com/example/example/example.html
regex
language-agnostic
url
пекин
источник
источник
CrackUrl
. Если такая функция существует, используйте ее, она почти гарантированно будет надежнее и эффективнее любого кода, созданного вручную.Ответы:
затем вы могли бы довольно легко продолжить синтаксический анализ хоста (разделенный '.').
Что я бы сделать , это использовать что - то вроде этого:
дальнейший синтаксический анализ «остального», чтобы быть как можно более конкретным. Делать это в одном регулярном выражении - это немного безумие.
источник
(.*)?
поскольку звезда Клини уже принимает 0 или больше,?
часть (0 или 1) сбивает ее с толку. Я исправил это, изменив(.*)?
на(.+)?
. Вы также можете просто удалить?
http://www.example.com:8080/....
Вот идет:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
Вы показываете этот код в действии на pythex.orgЯ понимаю, что опаздываю на вечеринку, но есть простой способ позволить браузеру проанализировать URL-адрес без регулярного выражения:
источник
http://
, для правильного отображения свойств протокола, хоста и имени хоста. В противном случае начало URL-адреса до первой косой черты переходит в свойство протокола.var url = new URL(someUrl)
Я опоздал на вечеринку на несколько лет, но удивлен, что никто не упомянул, что в спецификации Uniform Resource Identifier есть раздел о синтаксическом анализе URI с помощью регулярного выражения . Регулярное выражение, написанное Бернерсом-Ли и др., Выглядит следующим образом:
Как бы то ни было, я обнаружил, что мне нужно избегать косых черт в JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
источник
1
:: Это правильно работает с другими протоколами, такими какftp://
иmailto://
.2
: Это правильно работает сusername
иpassword
. Эти необязательные поля разделены двоеточием, как и имя хоста и порт, и это приведет к отключению большинства других регулярных выражений, которые я видел. @ RémyDAVID Строка запроса также не анализируется нормальноlocation
объектом браузера . Если вам нужно проанализировать строку запроса, взгляните на мою крошечную библиотеку: uqs .user:pass@example.com
- RFC 3986 говорит:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Я обнаружил, что ответ с наибольшим количеством голосов (ответ домашнего тоста) не работает для меня идеально. Две проблемы:
Ниже приводится модифицированная версия:
Положение деталей следующее:
Редактировать опубликовано анонимным пользователем:
источник
http://www.example.com
или если путь состоит из одного символа, напримерhttp://www.example.com/a
.Мне нужно было регулярное выражение для соответствия всем URL-адресам, и я сделал это:
Он соответствует всем URL-адресам, любому протоколу, даже таким URL-адресам, как
Результат (в JavaScript) выглядит так:
URL как
выглядит так:
источник
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Я пытался решить эту проблему с помощью javascript, с чем следует справиться:
поскольку (по крайней мере, в Chrome) он анализирует:
Однако это не кроссбраузер ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), поэтому я собрал все это вместе, чтобы извлечь те же части, что и выше:
Кредит за это регулярное выражение принадлежит https://gist.github.com/rpflorence, который разместил этот jsperf http://jsperf.com/url-parsing (первоначально найденный здесь: https://gist.github.com/jlong/2428561 # comment-310066 ), придумавший регулярное выражение, на котором оно изначально было основано.
Детали расположены в таком порядке:
Также есть небольшая библиотека, которая обертывает его и предоставляет параметры запроса:
https://github.com/sadams/lite-url (также доступно на bower)
Если у вас есть улучшения, создайте запрос на перенос с большим количеством тестов, я приму его и с благодарностью объединю.
источник
http://test1.dev.mydomain.com/
например, вытащил быtest1.dev.
.Предложите гораздо более читаемое решение (на Python, но применимо к любому регулярному выражению):
Печать:
источник
субдомен и домен сложны, потому что субдомен может состоять из нескольких частей, как и домен верхнего уровня, http://sub1.sub2.domain.co.uk/
(Markdown не очень дружелюбен к регулярным выражениям)
источник
(http(s?)://[^/]+/)
чтобы также захватить httpsЭта улучшенная версия должна работать так же надежно, как парсер.
источник
Попробуйте следующее:
Он поддерживает HTTP / FTP, поддомены, папки, файлы и т. Д.
Я нашел это при быстром поиске в гугле:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
источник
Из моего ответа на аналогичный вопрос . Работает лучше, чем некоторые из других упомянутых, потому что в них были некоторые ошибки (например, не поддерживались имя пользователя / пароль, не поддерживались односимвольные имена файлов, идентификаторы фрагментов были сломаны).
источник
Вы можете получить все http / https, хост, порт, путь, а также запрос, используя объект Uri в .NET. просто сложная задача - разбить хост на субдомен, доменное имя и TLD.
Для этого нет стандарта, и нельзя просто использовать синтаксический анализ строк или регулярное выражение для получения правильного результата. Сначала я использую функцию RegEx, но не все URL-адреса могут правильно анализировать поддомен. Практический способ - использовать список TLD. После определения TLD для URL-адреса левая часть является доменом, а оставшаяся часть - поддоменом.
Однако список необходимо поддерживать, поскольку новые TLD возможны. На данный момент я знаю, что publicsuffix.org поддерживает последний список, и вы можете использовать инструменты парсера имени домена из кода Google, чтобы проанализировать список общедоступных суффиксов и легко получить поддомен, домен и TLD с помощью объекта DomainName: domainName.SubDomain, domainName .Domain и domainName.TLD.
Это также полезно: получить субдомен с URL-адреса
CaLLMeLaNN
источник
Вот тот, который полный и не полагается ни на какой протокол.
Печать
источник
Ничто из вышеперечисленного не помогло мне. Вот что я в итоге использовал:
источник
Мне нравится регулярное выражение, опубликованное в «Javascript: The Good Parts». Он не слишком короткий и не слишком сложный. На этой странице в github также есть код JavaScript, который его использует. Но он может быть адаптирован для любого языка. https://gist.github.com/voodooGQ/4057330
источник
Java предлагает класс URL, который сделает это. Объекты URL запроса.
Кстати , PHP предлагает parse_url () .
источник
Я бы рекомендовал не использовать регулярное выражение. Вызов API, такой как WinHttpCrackUrl () , менее подвержен ошибкам.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
источник
Я попробовал несколько из них, которые не соответствовали моим потребностям, особенно получившие наибольшее количество голосов, которые не поймали URL без пути ( http://example.com/ )
также отсутствие названий групп сделало его непригодным для использования в анзибле (или, возможно, мои навыки jinja2 отсутствуют).
так что это моя версия, слегка измененная с исходной версией, получившей наибольшее количество голосов:
источник
Использование регулярного выражения http://www.fileformat.info/tool/regex.htm hometoast отлично работает.
Но вот в чем дело: я хочу использовать разные шаблоны регулярных выражений в разных ситуациях в моей программе.
Например, у меня есть этот URL-адрес, и у меня есть перечисление, в котором перечислены все поддерживаемые URL-адреса в моей программе. Каждый объект в перечислении имеет метод getRegexPattern, который возвращает шаблон регулярного выражения, который затем будет использоваться для сравнения с URL-адресом. Если конкретный шаблон регулярного выражения возвращает истину, то я знаю, что этот URL-адрес поддерживается моей программой. Итак, каждое перечисление имеет собственное регулярное выражение в зависимости от того, где оно должно искать внутри URL.
Предложение Hometoast отличное, но в моем случае я думаю, что это не поможет (если я не скопирую одно и то же регулярное выражение во все перечисления).
Вот почему я хотел, чтобы ответ давал регулярное выражение для каждой ситуации отдельно. Хотя +1 за домашний тост. ;)
источник
Я знаю, что вы утверждаете, что это не зависит от языка, но можете ли вы сказать нам, что вы используете, чтобы мы знали, какие у вас есть возможности регулярного выражения?
Если у вас есть возможности для не захватывающих совпадений, вы можете изменить выражение hometoast так, чтобы подвыражения, которые вам не нужны, были настроены следующим образом:
(?:SOMESTUFF)
Вам все равно придется копировать и вставлять (и немного изменять) регулярное выражение в нескольких местах, но это имеет смысл - вы не просто проверяете, существует ли подвыражение, а существует ли оно как часть URL-адреса . Использование модификатора без захвата для подвыражений может дать вам то, что вам нужно, и ничего больше, что, если я правильно вас понимаю, это то, что вы хотите.
В качестве небольшого примечания, выражение hometoast не должно заключать скобки вокруг 's' для 'https', поскольку в нем только один символ. Квантификаторы количественно определяют один символ (или класс символов, или часть выражения), непосредственно предшествующий им. Так:
https?
будет просто соответствовать 'http' или 'https'.
источник
regexp, чтобы получить URL-путь без файла.
url = ' http: // domain / dir1 / dir2 / somefile ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) + (? = /)) ? /? (?: [^ /] +)? $ / I) .to_s
Это может быть полезно для добавления относительного пути к этому URL-адресу.
источник
Регулярное выражение для полного синтаксического анализа довольно ужасно. Я включил именованные обратные ссылки для удобочитаемости и разбил каждую часть на отдельные строки, но это все равно выглядит так:
То, что требует, чтобы он был таким подробным, заключается в том, что, за исключением протокола или порта, любая из частей может содержать объекты HTML, что делает определение фрагмента довольно сложным. Итак, в последних нескольких случаях - хост, путь, файл, строка запроса и фрагмент - мы разрешаем любой объект html или любой символ, кроме
?
или#
. Регулярное выражение для html-сущности выглядит так:Когда это извлекается (я использовал синтаксис усов для его представления), он становится немного более разборчивым:
В JavaScript, конечно, нельзя использовать именованные обратные ссылки, поэтому регулярное выражение становится
и в каждом совпадении протокол
\1
, хост\2
, порт\3
, путь\4
, файл\5
, строка запроса\6
и фрагмент\7
.источник
источник
Я пробовал это регулярное выражение для разбора разделов URL:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Спички:
источник
Будет предоставлен следующий вывод:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Если вы измените URL-адрес на
String s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; вывод будет следующим:
1: https: //
2: www.thomas-bayer.com
3 :?
4: wsdl = qwerwer & ttt = 888
наслаждайтесь ..
Йоси Лев
источник