2009-06-23 7 views
1

OK, so arbeite ich mit einem kleinen regulären Ausdruck - es ist mein erstes Mal, bitte, sei sanft - und ich habe ein Problem, wo ich eine Variable setzen kann Aber wenn ich versuche, etwas mit dieser Variablen zu tun, verursacht das Probleme.Meine RegEx verschraubt den Rest meines Javascript

Hier ist mein Skript:

$(document).ready(function() { 
    var show_number; 
    var url_param; 

    $("a[rel=more]").live("click", function(){ 
     url_param = $(this).attr("href").match(/show:[^/]+/i); 
     show_number = url_param.substr(5); 

     alert(show_number); 

     return false; 
    }); 
}); 

Anstatt nun die Warnung die Art und Weise zu zeigen, es sollte es folgt einfach dem Link. Wenn ich jedoch die Variable "show_number" loslasse und sie auf "url_param" aufmerksam mache, ist alles in Ordnung.

Ich brauche im Grunde, was nach den ersten fünf Zeichen dieser RegEx kommt. Ich habe versucht, die Funktion substr() direkt hinzuzufügen, aber das schien nicht zu helfen.

Was mache ich falsch?

Antwort

0

Nein, das Problem ist nicht mit dem Backslash. Jacob hat Recht, es muss nicht zitiert werden.

Das Problem ist, dass die Übereinstimmung tatsächlich ein Array zurückgibt. Daher funktioniert der folgende einfache Testfall NICHT.

<html> 
<script type="text/javascript"> 
var a='show: something'; 
url_param = a.match(/show:[^/]+/i); 
show_number = url_param.substring(5); 
alert (show_number); 
</script> 
</html> 

Allerdings funktioniert diese zweite Version.

<html> 
<script type="text/javascript"> 
var a='show: something'; 
url_param = a.match(/show:[^/]+/i); 
show_number = url_param[0].substring(5); 
alert (show_number); 
</script> 
</html> 

Noch besser ist es wahrscheinlich etwas explizit die Leerzeichen behandelt, Schecks für Anfang und Ende der Schnur, und macht eine Mustererkennung Extraktion.

<html> 
<script type="text/javascript"> 
var a='show: something'; 
url_param = a.match(/^\s*show:\s*([^/]+)\s*$/i); 
show_number = url_param[0].substring(5); 
alert (show_number); 
</script> 
</html> 

Das ist ein bisschen mehr kugelsicher.

3

match() einen Array zurückzugibt, kein String, so auf einem Minimum Sie so etwas wie dieses benötigen:

url_param = $(this).attr("href").match(/show:[^/]+/i); 
if (url_param && url_param.length > 0) { 
    show_number = url_param[0].substr(5); 
    alert(show_number); 
} 

Eine ordentliche Art und Weise das Stück der URL nach dem zu bekommen „Show“ ist Klammer zu verwenden, dass ein Teil der URL zu erfassen, die in url_param[1] enden werden:

url_param = $(this).attr("href").match(/show:([^/]+)/i); 
if (url_param && url_param.length > 0) { 
    show_number = url_param[1]; 
    alert(show_number); 
} 
+1

Sie sollten auch sicherstellen, dass url_param nicht null ist. Wenn die Übereinstimmung fehlschlägt, wird null zurückgegeben, kein leeres Array. In diesem Fall reicht die Überprüfung auf null sogar aus, da RegExp die erfasste Gruppe benötigt. –

+0

@Matthew: Guter Punkt; jetzt behoben. Vielen Dank! – RichieHindle

0

ich denke, das Problem ist, dass die JavaScript-Interpreter Ihren Code nicht analysieren können. Ihre regex:

/show:[^/]+/i 

Sollte sein:

/show:[^\/]+/i 

weil der Schrägstrich vorzeitig Ihre regex endet. Um dies zu überprüfen, sollten Sie die JavaScript-Fehlerkonsole Ihres Browsers anzeigen, um festzustellen, ob Sie einen JavaScript-Fehler erhalten.

+0

@Jacob: Es funktioniert gut für mich, wie es ist (was ich glaube, ist richtig, weil ein Schrägstrich in einer Zeichenklasse die Regex nicht beenden sollte), aber ein Backslash kann nicht schaden. – RichieHindle

Verwandte Themen