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 //
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'
}
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!
(http[s]?:\/\/)?([^\/\s]+\/)(.*)
groupe 3
Démo: http://regex101.com/r/vK4rV7/1
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.
Je pense que c'est ce que vous recherchez: [^/]+$
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.
Vous voulez dire un regard négatif? (?<!/)
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') );