2009-01-14 10 views
11

J'ai besoin d'écrire du javascript pour enlever le nom d'hôte: partie du port d'une URL, ce qui signifie que je veux extraire la partie chemin uniquement.Expression régulière pour supprimer le nom d'hôte et le port de l'URL?

dire que je veux écrire une fonction getPath (URL) de telle sorte que GetPath ("http://host:8081/path/to/something") renvoie "/ chemin/vers/quelque chose"

Cela peut-il être fait en utilisant des expressions régulières?

+0

Ceci n'exige pas du tout d'expressions régulières - voir ma réponse :) – James

+0

Ce n'est pas qu'il n'exige pas des expressions régulières. Cela ne devrait pas être fait en utilisant des expressions régulières. –

+0

Mais c'est toujours utile à savoir. –

Répondre

10

rapide 'n' sale:

^[^#]*?://.*?(/.*)$

Tout ce qui suit le nom d'hôte et le port (y compris le premier /) est capturé dans le premier groupe.

+0

Ou sous forme littérale d'expression régulière ("/" doit être échappé):/^.*?:\/\/.*?(\/.*)$/.exec("http://example.com/ folder/file.ext ") [1] donne" /folder/file.ext " –

+2

Cette regex est erronée. Il capture le chemin, la requête et le fragment dans le groupe 1. –

+0

Regex n'est pas nécessaire du tout! Bien cependant! – James

1

Cette expression régulière semble fonctionner: (http://[^/] ) (/.)

Comme un test j'ai couru cette recherche et remplacer dans un éditeur de texte:

Search: (http://[^/]*)(/.*) 
Replace: Part #1: \1\nPart #2: \2 

Il a converti ce ce texte:

http://host:8081/path/to/something 

dans ceci:

Part #1: http://host:8081 
Part #2: /path/to/something 

et converti ceci:

http://stackoverflow.com/questions/441755/regular-expression-to-remove-hostname-and-port-from-url 

dans ce:

Part #1: http://stackoverflow.com 
Part #2: /questions/441755/regular-expression-to-remove-hostname-and-port-from-url 
+1

Vous pouvez utiliser https?: // pour que les URL https: // fonctionnent également. –

27

RFC 3986 (http://www.ietf.org/rfc/rfc3986.txt) dit à l'annexe B

La ligne suivante est l'expression régulière pour briser -d'une référence URI bien formée dans ses composants.

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
    12   3 4   5  6 7  8 9 

Les chiffres de la deuxième ligne ci-dessus servent uniquement à faciliter la lisibilité; ils indiquent les points de référence pour chaque sous-expression (c'est-à-dire, chaque parenthèse appariée). Nous nous référons à la valeur correspondant à la sous-expression en $. Par exemple, correspondant à l'expression ci-dessus pour

http://www.ics.uci.edu/pub/ietf/uri/#Related 

résultats dans les matchs de sous-expression suivants:

$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> indique que le composant n'est pas présent, comme le cas pour le composant de requête dans la exemple ci-dessus. Par conséquent, nous peut déterminer la valeur des cinq composants

scheme = $2 
    authority = $4 
    path  = $5 
    query  = $7 
    fragment = $9 
+2

La regex est par erreur entourée de ** et **. –

+0

Une réponse complète et un que j'ai trouvé utile, mais pas aussi direct que la réponse acceptée. Merci. – lucasrizoli

+0

@Rene, fixe. Merci d'avoir fait remarquer cela. –

13

Je sais que les expressions régulières sont utiles, mais ils ne sont pas nécessaires dans cette situation. L'objet Location est inhérent à tous les liens dans le DOM et possède une propriété chemin d'accès.Donc, pour accéder à cette propriété de quelque URL aléatoire, vous pourriez avoir besoin de créer un nouvel élément DOM, puis de retourner son chemin d'accès.

Un exemple, qui fonctionnera toujours parfaitement:

function getPath(url) { 
    var a = document.createElement('a'); 
    a.href = url; 
    return a.pathname.substr(0,1) === '/' ? a.pathname : '/' + a.pathname; 
} 

Version jQuery: (utilise regex ajouter barre oblique si nécessaire)

function getPath(url) { 
    return $('<a/>').attr('href',url)[0].pathname.replace(/^[^\/]/,'/'); 
} 
+0

Je sais que c'est un vieux post, mais j'aime beaucoup votre méthode J-P :) – Ben

+0

ouais, j'aime aussi cet article! – Chani

+0

Ne fonctionne pas si l'URL contient des paramètres. – lulalala

3

L'objet window.location a chemin, de recherche et propriétés de hachage qui contiennent ce dont vous avez besoin.

pour cette page

location.pathname = '/questions/441755/regular-expression-to-remove-hostname-and-port-from-url' 
location.search = '' //because there is no query string 
location.hash = '' 

vous pouvez donc utiliser

var fullpath = location.pathname+location.search+location.hash 
Questions connexes