web-dev-qa-db-ja.com

URLからの正規表現URLパス

正規表現に少し問題があります。

このvideoplayのパスを取得しようとしています。

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

この正規表現/.+を使用すると、/videoにも一致します。

//を含めないようにするには、何らかの反/否定的な一致が必要です

12
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' 
}
7
ThomasReggi

JavaScript Webアプリにこれが必要な場合:このトピックについて私が見つけた最良の答えは here です。コードの基本(およびオリジナル)バージョンは次のようになります。

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"

ジョンロング、日ごとに作成していただきありがとうございます。

27
Vlad Mysla

(http[s]?:\/\/)?([^\/\s]+\/)(.*)グループ3
デモ: http://regex101.com/r/vK4rV7/1

8
M G

あなたはこれを試すことができます:

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

([^?] +)は、パスを返すキャプチャグループです

これはすべてURLの正規表現ではないことに注意してください。それは、「//」の後に発生する最初の「/」と次の「?」の間のすべてのテキストを一致させるという問題を解決するだけです。キャラクター。

すべてが一致する正規表現が必要な場合は、これをチェックできます StackOverflow link ここで、URIのすべての可能性について議論し、「パス」を含む構成部分に分解しました。
やり過ぎだと考え、かつ入力URLが常に最初の「/」と次の「?」の間のパスを持つパターンに従うことがわかっている場合は、上記の正規表現で十分です。

3
Kash
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') );
3
Vlad Mysla

これはあなたが望んでいることだと思います:[^/]+$

デモ: http://regex101.com/r/rG8gB9

1
Firas Dib

これは正規表現ソリューションではありませんが、ほとんどの言語には、URLを構成要素に解析するURLライブラリがあります。これはあなたがやっていることのためのより良い解決策かもしれません。

1
Toby Allen

あなたは後ろ向きの否定的な意味ですか? (?<!/)

1