2010-09-05 6 views
1

J'ai une URL qui ressemble à http://mysite.com/#id/Blah-blah-blah, elle est utilisée pour les bits Ajax-ey. Je veux utiliser substring() ou substr() pour obtenir la pièce id. ID peut être n'importe quelle combinaison de n'importe quelle longueur de lettres et de chiffres.Javascript substring() trickery

Jusqu'à présent, j'ai obtenu:

var hash = window.location.hash; 
alert(hash.substring(1)); // remove # 

qui supprime le hachage avant, mais je ne suis pas un codeur JS et je me bats un peu. Comment puis-je supprimer tout sauf la pièce id? Je ne veux rien après et en incluant la barre finale soit (/Blah-blah-blah).

Merci!

Jack

Répondre

4

Maintenant, c'est un cas où les expressions régulières auront un sens. L'utilisation de la sous-chaîne ici ne fonctionnera pas à cause des longueurs variables des chaînes.

Ce code suppose que la partie id ne contient aucune barre oblique.

var hash = "#asdfasdfid/Blah-blah-blah"; 
hash.match(/#(.+?)\//)[1]; // asdfasdfid 
  • Le . correspond à tout caractère et
  • conjointement avec les + une ou plusieurs caractères
  • la ? rend la correspondance non gourmand afin qu'il arrête à la première occurrence d'un / dans la chaîne

Si la partie id peut contenir des barres obliques supplémentaires et que la barre oblique finale est le séparateur x fera votre enchère

var hash = "#asdf/a/sdfid/Blah-blah-blah"; 
hash.match(/#(.+?)\/[^\/]*$/)[1]; // asdf/a/sdfid 

Juste pour le plaisir ici sont des versions n'utilisant pas d'expressions régulières.

Pas de barres obliques dans id-partie:

var hash = "#asdfasdfid/Blah-blah-blah", 
    idpart = hash.substr(1, hash.indexOf("/")); 

par des barres obliques dans id-partie (dernière barre oblique est séparateur):

var hash = "#asdf/a/sdfid/Blah-blah-blah", 
    lastSlash = hash.split("").reverse().indexOf("/") - 1, // Finding the last slash 
    idPart = hash.substring(1, lastSlash); 
+1

Cela devrait être '[1]', puisque vous voulez le groupe capturé. –

+0

Je viens de réaliser que :) – adamse

+0

Excellente, réponse complète, merci adamse! – Jack

1

peut-être un regex

window.location.hash.match(/[^#\/]+/) 
+1

Cette expression rationnelle ne correspondra qu'à 1 caractère. – adamse

0

Utilisation IndexOf pour déterminer la position du/après id et utilisez ensuite string.substr (start, length) pour obtenir la valeur de l'id.

var hash = window.location.hash; 
var posSlash = hash.indexOf("/", 1); 
var id = hash.substr(1, posSlash -1) 

Vous avez besoin tonne inclure un code de validation pour vérifier l'absence de/

+0

@Erik, il n'utilise pas * 'substring'. Le second paramètre de ['substr'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr) est la longueur, donc c'est correct. –

1
var hash = window.location.hash; 
var matches = hash.match(/#(.+?)\//); 
if (matches.length > 1) { 
    alert(matches[1]); 
} 
0

La façon la plus à toute épreuve pour le faire est probablement la suivante:

function getId() { 
    var m = document.location.href.match(/\/#([^\/&]+)/); 
    return m && m[1]; 
} 

Ce code ne assumer quoi que ce soit à propos de ce qui vient après l'ID (le cas échéant). L'identifiant qu'il attrape est tout sauf les barres obliques et les esperluettes.

Si vous voulez attraper seulement des lettres et des chiffres que vous pouvez le modifier à ce qui suit:

function getId() { 
    var m = document.location.href.match(/\/#([a-z0-9]+)/i); 
    return m && m[1]; 
} 
0

Celui-ci est pas un bon aproche, mais que vous souhaitez utiliser si vous voulez ...

var relUrl = "http://mysite.com/#id/Blah-blah-blah"; 
var urlParts = []; 
urlParts = relUrl.split("/"); // array is 0 indexed, so 
var idpart = = urlParts[3] // your id will be in 4th element 
id = idpart.substring(1) //we are skipping # and read the rest