web-dev-qa-db-fra.com

Chemin de l'URL regex à partir de l'URL

J'ai un peu de problèmes de regex.

J'essaie d'obtenir le chemin dans cette URL videoplay.

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

Si j'utilise cette expression rationnelle /.+, elle correspond également à /video.

J'aurais besoin d'une sorte de correspondance anti/négative pour ne pas inclure //

8
ThomasReggi

Cette expression obtient tout après videoplay, aussi appelé le chemin de l'URL.

/\/(videoplay.+)/

Cette expression obtient tout après le port. Comprenant également le chemin.

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

Cependant, si vous utilisez Node.js, je vous recommande le module natif url.

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

Lequel des regex fonctionnent pour vous.

{
  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

Au cas où vous en auriez besoin pour votre application web JavaScript: la meilleure réponse que j'ai trouvée sur ce sujet est ici . La version de base (et aussi originale) du code ressemble à ceci:

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"

Merci John Long, tu l'as fait de jour!

23
Vlad Mysla

(http[s]?:\/\/)?([^\/\s]+\/)(.*) groupe 3
Démo: http://regex101.com/r/vK4rV7/1

7
M G

Vous pouvez essayer ceci:

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

([^?] +) ci-dessus est le groupe de capture qui renvoie votre chemin.

S'il vous plaît noter que ce n'est pas une regex tout-URL. Cela résout simplement votre problème de correspondance de tout le texte entre le premier "/" apparaissant après "//" et le suivant "?" personnage.

Si vous avez besoin d'une expression rationnelle parfaitement concordante, vous pouvez vérifier ce lien lien StackOverflow où ils ont discuté et disséqué toutes les possibilités d'un URI dans ses éléments constitutifs, y compris votre "chemin".
Si vous considérez qu'une surcharge et que vous savez que votre URL d’entrée suivra toujours le même schéma de chemin entre le premier "/" et le suivant "?", Alors la regex ci-dessus devrait suffire. 

2
Kash

Je pense que c'est ce que vous recherchez: [^/]+$

Démo: http://regex101.com/r/rG8gB9

1
Firas Dib

Ce n'est pas une solution regex, mais la plupart des langues ont une bibliothèque d'URL qui analysera toute URL dans ses composants Cela peut être une meilleure solution pour ce que vous faites.

1
Toby Allen

Vous voulez dire un regard négatif? (?<!/)

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