Youtube-Id aus URL extrahieren
bastold
- javascript
Hallo!
Ich möchte aus einer Youtube-URL die Id extrahieren, also aus
http://www.youtube.com/watch?v=hYgw7XRf5nc&feature=player_embedded
das "hYgw7XRf5nc"
Dazu verwende ich folgende Regex x=a.match(/\?v=(.*)/);
Problemlos steht in RegExp.$1
die korrekte Id.
Habe ich als Ausgangs-URL aber dies hier http://www.youtube.com/watch?v=hYgw7XRf5nc&feature=player_embedded
und versuche mit x=a.match(/\?v=(.*)&?/);
die Id auszulesen, liefert mir RegExp.$1
dagegen "hYgw7XRf5nc&feature=player_embedded" zurück.
Ich versteh nicht, warum. Selbst wenn ich das "&" mit "" maskiere, ändert das nichts am Ergebnis.
Kann mir jemand weiterhelfen?
Danke!
Oh, die erste angegeben URL muss wie folgt lauten:
http://www.youtube.com/watch?v=hYgw7XRf5nc
Hi!
Habe ich als Ausgangs-URL aber dies hier http://www.youtube.com/watch?v=hYgw7XRf5nc&feature=player_embedded
und versuche mitx=a.match(/\?v=(.*)&?/);
die Id auszulesen, liefert mirRegExp.$1
dagegen "hYgw7XRf5nc&feature=player_embedded" zurück.
Ich versteh nicht, warum. Selbst wenn ich das "&" mit "" maskiere, ändert das nichts am Ergebnis.
Das Muster .* ist gierig. Das &? prüft, ob das & 0 oder einmal vorhanden ist. Am Ende des String ist es nicht vorhanden - Bedingung erfüllt. Und das gierige .* schnappt sich alles dazwischen. Dass du ein & siehst, dürfte damit zusammenhängen, wo du den Wert herbekommst oder wie du ihn ausgibst. Ich würde ja nicht .* suchen sondern alles was kein & ist.
Lo!
Das Muster .* ist gierig. Das &? prüft, ob das & 0 oder einmal vorhanden ist. Am Ende des String ist es nicht vorhanden - Bedingung erfüllt. Und das gierige .* schnappt sich alles dazwischen. Dass du ein & siehst, dürfte damit zusammenhängen, wo du den Wert herbekommst oder wie du ihn ausgibst. Ich würde ja nicht .* suchen sondern alles was kein & ist.
Hab es auch mit einem nongreedy-Parameter probiert, klappte auch nicht.
Hab es jetzt mit /?v=([a-zA-Z0-9_-]*)/ gelöst, gefällt mir aber nicht so richtig, weil ich damit nicht auf der sicheren Seite bin, falls Youtube noch ein weiteres Zeichen einbindet.
Hatte auch Vorschlaege wie ([^&]) gefunden, aber damit kam ich nicht klar.
Danke!
@@bastold:
nuqneH
Hab es jetzt mit /?v=([a-zA-Z0-9_-]*)/ gelöst, gefällt mir aber nicht so richtig, weil ich damit nicht auf der sicheren Seite bin, falls Youtube noch ein weiteres Zeichen einbindet.
Richtig bemerkt.
Hatte auch Vorschlaege wie ([^&]) gefunden
Genau das ist es. Und wenn du meinen Hinweis richtig verstanden hättest, würdest du das ';' mit in die negierte Zeichenklasse setzen: [^&;]
aber damit kam ich nicht klar.
Was heißt das genau? Mir schwant, dass du vergessen hast anzugeben, dass du nicht genau ein Zeichen, sondern mehrere davon haben möchtest,
Qapla'
Das Muster .* ist gierig. Das &? prüft, ob das & 0 oder einmal vorhanden ist. Am Ende des String ist es nicht vorhanden - Bedingung erfüllt. Und das gierige .* schnappt sich alles dazwischen. Dass du ein & siehst, dürfte damit zusammenhängen, wo du den Wert herbekommst oder wie du ihn ausgibst. Ich würde ja nicht .* suchen sondern alles was kein & ist.
Es müsste doch aber möglich sein, alles was zwischen einem "=" und einem null oder einmal vorkommenden "&" steht, per Regex zu extrahieren.
Hätte nicht gedacht, dass mir dies solche Probleme bereitet :)
Hi!
Es müsste doch aber möglich sein, alles was zwischen einem "=" und einem null oder einmal vorkommenden "&" steht, per Regex zu extrahieren.
Na klar. Entweder die Gierigkeit abgewöhnen oder eine negierende Zeichenklasse richtig verwenden.
Hätte nicht gedacht, dass mir dies solche Probleme bereitet :)
An der Formulierung der Aufgabenstellung musst du noch etwas üben, damit dir sowas auffällt: Bei "alles was zwischen x und y steht" enthält "alles" natürlich auch x und y. Dir muss klar werden, dass der gedankliche Ausschluss deinerseits auch den Weg in den Code finden muss, beziehungsweise erstmal in die genaue Formulierung der Aufgabenstellung. Wichtig ist auch immer die Gierigkeit zu beachten. Es wird nicht einfach nur bis zum hinter dem Ausdruck stehenden Begriff gesucht, sondern solange wie es passt. Und 0 mal y ist überall zu finden, auch am Ende.
Lo!
@@bastold:
nuqneH
Dazu verwende ich folgende Regex
x=a.match(/\?v=(.*)/);
Du liest also alles nach 'v=' Stehende und wunderst dich, dass du alles nach 'v=' Stehende gelesen hast?
Du möchtest nicht alles lesen, sondern alles http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=außer '&'?
Übrigens ist '&' ein selten dähmlich gewähltes Trennzeichen. Andere sind denkbar, bspw. ';'. Das könntest du berücksichtigen.
Qapla'
Das "&" ist nun mal der Parametertrenner in URLs... dies kann ich leider nicht ändern :)
@@bastold:
nuqneH
Das "&" ist nun mal der Parametertrenner in URLs... dies kann ich leider nicht ändern :)
Davon war auch nicht die Rede, dass du das sollst.
Qapla'
Kann mir jemand weiterhelfen?
parse_url() und parse_str() - warum immer reguläre Ausdrucke, wenn es doch so schöne funktionen dafür gibt?
$foo = parse_url('http://www.youtube.com/watch?v=hYgw7XRf5nc&feature=player_embedded');
parse_str($foo['query'], $foo['query'])
print_r($foo);
Hi!
parse_url() und parse_str() - warum immer reguläre Ausdrucke, wenn es doch so schöne funktionen dafür gibt?
Javascript ist gefragt.
Lo!
parse_url() und parse_str() - warum immer reguläre Ausdrucke, wenn es doch so schöne funktionen dafür gibt?
Javascript ist gefragt.
Heute ist es sehr heiß :)
Aber dann halt JavaScript - da hat das Denken schon jemand anderer übernommen:
http://stevenlevithan.com/demo/parseuri/js/
Liefert auch zuverlässig das richtige Ergebnis.