Ответ 1
Быстрое 'n' грязное:
^[^#]*?://.*?(/.*)$
Все, что после имени хоста и порта (включая начальное /), будет записано в первой группе.
Мне нужно написать некоторый javascript, чтобы удалить имя узла: часть порта из url, что означает, что я хочу извлечь только часть пути.
то есть. Я хочу написать функцию getPath (url), так что getPath ( " http://host:8081/path/to/something" ) возвращает "/path/to/something"
Можно ли это сделать с помощью регулярных выражений?
Быстрое 'n' грязное:
^[^#]*?://.*?(/.*)$
Все, что после имени хоста и порта (включая начальное /), будет записано в первой группе.
RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt) говорится в Приложении B
Следующая строка - это регулярное выражение для разложения a правильно сформированный 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 version: (использует regex для добавления ведущей косой черты, если необходимо)
function getPath(url) {
return $('<a/>').attr('href',url)[0].pathname.replace(/^[^\/]/,'/');
}
Объект 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
Это регулярное выражение работает: (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
Это очень просто:
^\w+:.*?(:)\d*
Попытка найти второе появление ":", за которым следует номер и которому предшествует http или https.
Это работает ниже двух случаев
Пример:
http://localhost:8080/myapplication
https://localhost:8080/myapplication
Надеюсь, что это поможет.