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

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

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

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

Ответы [ 6 ]

28 голосов
/ 14 января 2009

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
13 голосов
/ 14 января 2009

Я знаю, что регулярные выражения полезны, но в этой ситуации они не нужны. Объект 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(/^[^\/]/,'/');
}
12 голосов
/ 14 января 2009

Quick 'n' dirty:

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

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

3 голосов
/ 14 января 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
1 голос
/ 24 мая 2017

Все очень просто:

^\w+:.*?(:)\d*

Попытка найти второе вхождение слова ":", за которым следует число, перед которым следует http или https.

Это работает для следующих двух случаев

Пример:

http://localhost:8080/myapplication

https://localhost:8080/myapplication

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

1 голос
/ 14 января 2009

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

и преобразовал это:

/247642/regulyarnoe-vyrazhenie-dlya-udaleniya-imeni-hosta-i-porta-iz-url

в это:

Part #1: http://stackoverflow.com
Part #2: /questions/441755/regular-expression-to-remove-hostname-and-port-from-url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...