Мне нужно написать javascript, чтобы удалить часть hostname: port из URL-адреса, что означает, что я хочу извлечь только часть пути.
т.е. я хочу написать функцию getPath (url), чтобы getPath ("http: // хост: 8081 / путь / к / чему-то") возвращал "/ path / to / something"
Можно ли это сделать с помощью регулярных выражений?
Дело не в том, что для этого не нужны регулярные выражения. Этого не следует делать с помощью регулярных выражений.
Но это все равно полезно знать.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Быстро и грязно:
^[^#]*?://.*?(/.*)$
Все, что находится после имени хоста и порта (включая начальное /), записывается в первую группу.
Или в буквальной форме регулярного выражения ("/" необходимо экранировать): /^.*?://.*?(/.*)$/.exec("example.com/folder/file.ext")[1] дает "/folder/file.ext "
Это неправильное регулярное выражение. Он фиксирует путь, запрос и фрагмент в группе 1.
Regex вообще не нужен! Хотя приятно!
@mikesamuel, вопрос задан удалить имя хоста и порт. Однако я исправлю свой ответ, чтобы получить подходящее объяснение.
@strager, разве это не преобразует некоторые URL-адреса, у которых нет схемы или части полномочий, в те, которые имеют. Например, #foo://bar//example.com/ не имеет схемы или полномочий, но ваше регулярное выражение изменит его на относительный URL-адрес протокола с полномочиями //example.com/.
@ Майк Самуэль, это правда. Как я уже сказал, это быстрое и грязное решение, отнюдь не надежное. Вы можете обойти проблему, используя [^#]*? вместо .*? для протокола. Я обновлю свой ответ, чтобы отразить это.
Это регулярное выражение, кажется, работает: (http: // [ ^ /] ) (/.)
В качестве теста я выполнил этот поиск и заменил в текстовом редакторе:
Search: (http://[^/]*)(/.*)
Replace: Part #1: \1\nPart #2: \2
Он преобразовал этот текст:
http://host:8081/path/to/something
в это:
Part #1: http://host:8081
Part #2: /path/to/something
и преобразовал это:
http://stackoverflow.com/questions/441755/regular-expression-to-remove-hostname-and-port-from-url
в это:
Part #1: http://stackoverflow.com
Part #2: /questions/441755/regular-expression-to-remove-hostname-and-port-from-url
RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt) говорится в Приложении B
Следующая строка - это регулярное выражение для разбивки правильно сформированная ссылка URI на его компоненты.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Цифры во второй строке выше предназначены только для облегчения чтения; они указывают ориентиры для каждого подвыражения (т. е. каждого парные скобки). Мы ссылаемся на значение, соответствующее подвыражению как $. Например, сопоставление приведенного выше выражения с
http://www.ics.uci.edu/pub/ietf/uri/#Related
приводит к следующим совпадениям подвыражения:
$1 = http:
$2 = http
$3 = //www.ics.uci.edu
$4 = www.ics.uci.edu
$5 = /pub/ietf/uri/
$6 = <undefined>
$7 = <undefined>
$8 = #Related
$9 = Related
где <undefined> указывает, что компонент отсутствует, как и
случай для компонента запроса в приведенном выше примере. Поэтому мы
можно определить значение пяти компонентов как
scheme = $2
authority = $4
path = $5
query = $7
fragment = $9
Регулярное выражение ошибочно окружено ** и **.
Подробный ответ, который я нашел полезным, хотя и не такой прямой, как принятый ответ. Спасибо.
Я знаю, что регулярные выражения полезны, но в этой ситуации они не нужны. Объект Location присущ всем ссылкам в DOM и имеет свойство pathname.
Итак, чтобы получить доступ к этому свойству некоторого случайного URL-адреса, вам может потребоваться создать новый элемент DOM, а затем вернуть его путь.
Пример, который ВСЕГДА будет работать идеально:
function getPath(url) {
var a = document.createElement('a');
a.href = url;
return a.pathname.substr(0,1) === '/' ? a.pathname : '/' + a.pathname;
}
Версия jQuery: (при необходимости использует регулярное выражение для добавления ведущей косой черты)
function getPath(url) {
return $('<a/>').attr('href',url)[0].pathname.replace(/^[^/]/,'/');
}
Я знаю, что это старый пост, но мне очень нравится твой метод JP :)
Обратите внимание, что это будет работать ТОЛЬКО, если у вас есть DOM. В таких средах, как node.js или веб-воркеры, DOM отсутствует. (Вероятно, это не обычное явление в 2009 году, когда был написан этот ответ ...)
Объект window.location имеет свойства pathname, search и hash, которые содержат то, что вам нужно.
для этой страницы
location.pathname = '/questions/441755/regular-expression-to-remove-hostname-and-port-from-url'
location.search = '' //because there is no query string
location.hash = ''
чтобы вы могли использовать
var fullpath = location.pathname+location.search+location.hash
Все очень просто:
^\w+:.*?(:)\d*
Попытка найти второе появление ":", за которым следует номер и которому предшествует http или https.
Это работает ниже двух случаев
Бывший:
http: // локальный: 8080 / мое приложение
https: // локальный: 8080 / мое приложение
Надеюсь это поможет.
Для этого совсем не нужны регулярные выражения - см. Мой ответ :)