it-swarm.com.ru

Regex URL Path из URL

У меня небольшая проблема с регулярными выражениями.

Я пытаюсь получить путь в этом URL videoplay.

http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello

Если я использую это регулярное выражение /.+, оно также соответствует /video.

Мне нужно какое-то анти/негативное совпадение, чтобы не включать //

8
ThomasReggi

Это выражение получает все после videoplay, то есть пути URL.

/\/(videoplay.+)/

Это выражение получает все после порта. Также состоящий из пути.

/\:\d./(.+)/

Однако при использовании Node.js я рекомендую встроенный модуль url.

var url = require('url')
var youtubeUrl = "http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello"
url.parse(youtubeUrl)

Который все регулярные выражения работает для вас.

{
  protocol: 'http:',
  slashes: true,
  auth: null,
  Host: 'video.google.co.uk:80',
  port: '80',
  hostname: 'video.google.co.uk',
  hash: '#hello',
  search: '?docid=-7246927612831078230&hl=en',
  query: 'docid=-7246927612831078230&hl=en',
  pathname: '/videoplay',
  path: '/videoplay?docid=-7246927612831078230&hl=en',
  href: 'http://video.google.co.uk:80/videoplay?docid=-7246927612831078230&hl=en#hello' 
}
6
ThomasReggi

В случае, если вам нужно это для вашего веб-приложения JavaScript: лучший ответ, который я когда-либо нашел по этой теме, - здесь . Базовая (а также оригинальная) версия кода выглядит так:

var parser = document.createElement('a');
parser.href = "http://example.com:3000/pathname/?search=test#hash";

parser.protocol; // => "http:"
parser.hostname; // => "example.com"
parser.port;     // => "3000"
parser.pathname; // => "/pathname/"
parser.search;   // => "?search=test"
parser.hash;     // => "#hash"
parser.Host;     // => "example.com:3000"

Спасибо Джон Лонг, ты сделал это днем!

23
Vlad Mysla

(http[s]?:\/\/)?([^\/\s]+\/)(.*) группа 3
Демо: http://regex101.com/r/vK4rV7/1

7
M G

Вы можете попробовать это:

^(?:[^/]*(?:/(?:/[^/]*/?)?)?([^?]+)(?:\??.+)?)$

([^?] +) выше - группа захвата, которая возвращает ваш путь.

Обратите внимание, что это не регулярное выражение для всех URL. Это просто решает вашу проблему соответствия всего текста между первым "/", встречающимся после "//", и последующим "?" персонаж.

Если вам нужно полностью совпадающее регулярное выражение, вы можете проверить эту ссылку StackOverflow где они обсудили и проанализировали все возможности URI в его составных частях, включая ваш "путь".
Если вы считаете, что излишнее И если вы знаете, что ваш входной URL всегда будет следовать вашему пути между первым «/» и следующим «?», То приведенного выше регулярного выражения должно быть достаточно. 

2
Kash

Я думаю, что это то, что вы ищете: [^/]+$

Демо: http://regex101.com/r/rG8gB9

1
Firas Dib

Это не решение регулярных выражений, но большинство языков имеют библиотеку URL, которая разбирает любой URL на его составные части. Это может быть лучшим решением для того, что вы делаете.

1
Toby Allen

Ты имеешь ввиду негативный взгляд сзади? (?<!/)

1
Niet the Dark Absol

function getPath(url, defaults){
    var reUrlPath = /(?:\w+:)?\/\/[^/]+([^?#]+)/;
    var urlParts = url.match(reUrlPath) || [url, defaults];
    return urlParts.pop();
}
alert( getPath('http://stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('https://stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('//stackoverflow.com/q/123/regex-url', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url?foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url#foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/?foo', 'unknown') );
alert( getPath('http://stackoverflow.com/q/123/regex-url/#foo', 'unknown') );
alert( getPath('http://stackoverflow.com/', 'unknown') );

1
Vlad Mysla