2009-07-19 12 views
42

Ich bin neu bei regulären Ausdrücken und frage mich, wie man einen formuliert, der alles nach dem letzten / sammelt.Regulärer Ausdruck, um alles nach dem letzten zu sammeln/

Ich extrahiere eine ID, die von Google GData verwendet wird.

mein Beispiel String

http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123 

Wo die Identifikation ist: p1f3JYcCu_cb0i0JYuCu123

Oh, und ich bin mit PHP.

+2

Welche Sprache verwenden Sie? – Gumbo

Antwort

82

Dies entspricht mindestens einer von (alles nicht ein Schrägstrich) gefolgt von Ende der Zeichenfolge:

[^/]+$ 


Hinweise:

  • Keine Pars, weil es keine Gruppen braucht - Ergebnis geht in Gruppe 0 (das Spiel selbst).
  • Verwendet + (anstelle von *), so dass, wenn das letzte Zeichen ein Schrägstrich ist, es nicht übereinstimmen kann (anstelle der Übereinstimmung der leeren Zeichenfolge).


Aber höchstwahrscheinlich eine schnellere und einfachere Lösung ist Ihre Sprache des integrierten String-Liste Verarbeitungsfunktionalität zu verwenden - das heißt ListLast(Text , '/') oder äquivalente Funktion.

Für PHP, ist die nächste Funktion ist strrchr die wie folgt funktioniert:

strrchr(Text , '/') 

Dieser Schrägstrich in den Ergebnissen enthalten - wie pro Teddy Kommentar unten, können Sie den Schrägstrich mit substr entfernen:

substr(strrchr(Text, '/'), 1); 
+6

+1 für die Verwendung von nicht-regex Lösung Sub-Bespannung der URL schneller wäre und regex Unterstützung importieren würde vermeiden –

+0

Tat -.. ich die meisten Funktionen vermuten für das rückwärts vom Ende funktionieren würde, und so vermeiden die meisten Zeichen Überprüfung Af. Aik alle Regex-Engines arbeiten nach vorne, müssten also jedes Zeichen prüfen. –

+1

Danke für die tolle Hilfe, ich weiß, dass Regex viel besser verstanden wird. Der PHP-Code sieht so aus. preg_match ('([^ /] + $)', "http://spreadsheets.google.com/feeds/tabellen/p1f3JYcCu_cb0i0JYuCu124 ", $ passt) – Hellonearthis

17

Allgemein:

/([^/]*)$ 

Die Daten, die Sie würde dann das Spiel der ersten Gruppe sein.


bearbeiten Da Sie mit PHP sind, werden Sie auch strrchr verwenden könnte, die bis zum Ende alles vom letzten Vorkommen eines Zeichens in einem String ist zurück. Oder Sie können eine Kombination von strrpos und substr verwenden, zuerst die Position des letzten Auftretens finden und dann den Teilstring von dieser Position bis zum Ende holen. Oder explode und array_pop, teilen Sie die Zeichenfolge an der / und erhalten Sie nur den letzten Teil.

+0

irgendwie sieht das nicht wie die Arbeit? – rasjani

+3

Sie müssen möglicherweise den Schrägstrich in der Zeichenklasse, abhängig von der Sprache, die Sie verwenden, umgehen. '/ ([^ \ /] * $ /' – rampion

+0

@rasjani: Es hängt von der Sprache ab, ob du den regulären Ausdruck benutzen kannst, wie ich ihn geschrieben habe.In einigen Sprachen gibt es ein Syntaxliteral für reguläre Ausdrücke (wie Perls/.../')), andere haben Klassen um einen String zu erstellen (wie Java) und andere verwenden nur Strings (wie PHP) Aber im Allgemeinen ist mein regulärer Ausdruck korrekt – Gumbo

2

Dieses Muster erfasst nicht den letzten Schrägstrich in $0 und es wird nichts gefunden, wenn nach dem letzten Schrägstrich keine Zeichen vorhanden sind.

/(?<=\/)([^\/]+)$/ 

Edit: aber es erfordert Lookbehind, das nicht von ECMAScript (JavaScript, Actionscript), Rubin oder a few other flavors. Wenn Sie eine dieser Aromen verwenden, können Sie verwenden:

/\/([^\/]+)$/ 

Aber es wird fangen den letzten Schrägstrich in $0.

+0

ruby19 hat Lookbehind unterstützen – rampion

6
/^.*\/(.*)$/ 

^ = Anfang der Zeile

.*\/ = gieriges Spiel zum letzten Auftreten zu/von Anfang der Zeile

(.*) = Gruppe von allem, was von/

nach dem letzten Auftreten kommt
1

keine PHP-Programmierer, aber strrpos scheint ein vielversprechender Ort zu starten. Finde das ganz rechte "/" und alles, was du gesucht hast. Keine Regex verwendet.

Findet das letzte Vorkommen eines Zeichens in einer Zeichenkette

+0

Ich dachte darüber nach, aber neue preg_match könnte es machen. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, Dinge zu tun, als die Art, wie ich damit fertig werde. – Hellonearthis

11

Sie können auch den „Dateiname“ erhalten, oder den letzten Teil, mit dem basename Funktion.

<?php 
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123'; 

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123" 

Auf meiner Box konnte ich nur die vollständige URL übergeben. Es ist möglich, dass Sie möglicherweise http:/ von der Vorderseite abziehen müssen.

Basename und dirname sind für durch etwas bewegen, das wie ein Unix-Dateipfad aussieht.

3

können Sie auch normale Zeichenfolge geteilt

$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123"; 
$s = explode("/",$str); 
print end($s); 
Verwandte Themen