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

Мне нужно написать javascript, чтобы удалить часть hostname: port из URL-адреса, что означает, что я хочу извлечь только часть пути.

т.е. я хочу написать функцию getPath (url), чтобы getPath ("http: // хост: 8081 / путь / к / чему-то") возвращал "/ path / to / something"

Можно ли это сделать с помощью регулярных выражений?

Для этого совсем не нужны регулярные выражения - см. Мой ответ :)

James 14.01.2009 12:04

Дело не в том, что для этого не нужны регулярные выражения. Этого не следует делать с помощью регулярных выражений.

Matthew Brubaker 14.01.2009 22:23

Но это все равно полезно знать.

arxpoetica 25.02.2011 18:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
3
26 269
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Быстро и грязно:

^[^#]*?://.*?(/.*)$

Все, что находится после имени хоста и порта (включая начальное /), записывается в первую группу.

Или в буквальной форме регулярного выражения ("/" необходимо экранировать): /^.*?://.*?(/.*)$/.exec("example.com/folder/file.ext")[1] дает "/folder/file.ext "

Ates Goral 14.01.2009 06:03

Это неправильное регулярное выражение. Он фиксирует путь, запрос и фрагмент в группе 1.

Mike Samuel 14.01.2009 08:20

Regex вообще не нужен! Хотя приятно!

James 14.01.2009 12:13

@mikesamuel, вопрос задан удалить имя хоста и порт. Однако я исправлю свой ответ, чтобы получить подходящее объяснение.

strager 14.01.2009 22:09

@strager, разве это не преобразует некоторые URL-адреса, у которых нет схемы или части полномочий, в те, которые имеют. Например, #foo://bar//example.com/ не имеет схемы или полномочий, но ваше регулярное выражение изменит его на относительный URL-адрес протокола с полномочиями //example.com/.

Mike Samuel 20.11.2011 21:51

@ Майк Самуэль, это правда. Как я уже сказал, это быстрое и грязное решение, отнюдь не надежное. Вы можете обойти проблему, используя [^#]*? вместо .*? для протокола. Я обновлю свой ответ, чтобы отразить это.

strager 21.11.2011 01:10

Это регулярное выражение, кажется, работает: (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

Регулярное выражение ошибочно окружено ** и **.

Rene Saarsoo 14.01.2009 10:25

Подробный ответ, который я нашел полезным, хотя и не такой прямой, как принятый ответ. Спасибо.

lucasrizoli 09.07.2011 01:24

Я знаю, что регулярные выражения полезны, но в этой ситуации они не нужны. Объект 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 :)

Ben 12.02.2010 07:59

Обратите внимание, что это будет работать ТОЛЬКО, если у вас есть DOM. В таких средах, как node.js или веб-воркеры, DOM отсутствует. (Вероятно, это не обычное явление в 2009 году, когда был написан этот ответ ...)

Peter 04.11.2016 18:23

Объект 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 / мое приложение

Надеюсь это поможет.

Другие вопросы по теме