2010-11-19 14 views
0

ich diese reg ex haben, was ist falsch mit diesem reg ex

var id = url.match(/(\d+)\/\d+$/)[1]; 

, die eine URL

http://whatever.com/something/70/48/359 

Es wird Parsen ist die 48, wie es sollte greifen aber es funktioniert nicht auf

http://whatever.com/something/70/48/359# 

Warum ist die # die Regex verwirrend

+2

Die zweite URL nicht mit einer Ziffer endet, sondern mit '#'. – Gumbo

+0

Woher kommt 'url'? Wenn es der Speicherort des aktuellen Dokuments ist, verwenden Sie besser 'location.pathname'. – Gumbo

Antwort

5

diesen regulären Ausdruck Versuchen Sie stattdessen:

/(\d+)\/\d+(?:$|[?#])/ 

Das ist nicht nur das Ende der Zeichenfolge übereinstimmt, sondern auch die Trennzeichen für die Abfrage (?) und das Fragment (#).

Und wenn Ihr url zufällig der Speicherort des Dokuments ist (z. B. location.href), verwenden Sie besser stattdessen location.pathname.

+1

Beachten Sie, dass dies auch übereinstimmt 'http: //whatever.com/something/70/48/359? SomeVar = foo' – aschepler

2

T er # ist keine Ziffer. Versuchen:

(\d+)\/\d+#?$ 
1

Da die \d+ und $ zeigen an, dass die Zeile mit einer oder mehreren Ziffern enden. Da das zweite Beispiel mit # endet, gibt es in diesem Fall keine Übereinstimmung.

1

Der $ Anker regexp an das Ende der Zeichenfolge. Da # keine Ziffer ist, stimmt die Regexp nicht mit dem zweiten Beispiel überein.

5

Wegen der ... \d+$ was bedeutet "nach der letzten Nummer muss das Ende der URL sofort folgen" (mit # nicht dazwischen).

2

Die $ am Ende verankert die Regex an das Ende der URL, was bedeutet, dass es nur übereinstimmt, wenn die beiden Zahlen am Ende kommen. Sie können (#.*)? bis zum Ende hinzufügen für eine optionale #anchor zu ermöglichen:

// Allow optional anchor. 
var id = url.match(/(\d+)\/\d+(#.*)?$/)[1]; 

Sie auch eine Abfragezeichenfolge als auch ermöglichen möchten, das Teil nach einem Fragezeichen. Dafür (\?.*?)? hinzuzufügen als auch:

// Allow optional query string and anchor. 
var id = url.match(/(\d+)\/\d+(\?.*?)?(#.*)?$/)[1]; 
1

Der \d+$ Teil bedeutet „eine oder mehr Ziffern, die von dem Ende der Zeichenkette, gefolgt“. Wenn dazwischen ein # ist, stimmt es nicht mehr überein.

Wenn alles, was Sie tun möchten, ist ein endgültiges # Zeichen erlauben, versuchen:

/(\d+)\/\d+\#?$/ 
1

Dies ist nicht gerade ein Update auf die regex, aber Sie können das „#“ angezeigt wird, in der URL stoppen durch Ändern der Links, die <a href="#"> zu sein <a href="#" onclick="return false;"> sind

Es wäre wahrscheinlich einfacher, es unauffällig mit jQuery so zu tun ...

$(function() { 
    $("a[href=\\#]").click(function(e) { 
    e.preventDefault(); 
    }); 
}); 
+0

Funktioniert nicht, wenn der Benutzer JavaScript deaktiviert hat. (Aber wenn JS benötigt wird, um die Seite zu benutzen, ist es nicht wirklich wichtig.) – JJJ

2

Weil es erwartet, dass die Zeichenfolge mit Ziffern zu beenden, weil der Dollar-Zeichen in \d+$.

Hier ist Ihre regex festen #anchors und ?query=strings zu ignorieren:

var id = url.match(/(\d+)\/\d+(|#.*|\?.*)$/)[1]; 

Der (|#.*|\?.*) Teil wird entweder Spiel nichts, #anything oder irgendetwas?.

Oder effizienter:

var id = url.match(/(\d+)\/\d+([#\?].*)?$/)[1]; 
1

var id = url.match(/(\d+)\/\d+#?$/)[1];

Wird beheben ya

0
.match(/(\d+)\/\d+[^\/]*$/)[1]