Regex-zu-match-Youtube URL ' s
Ich versuche zu validieren, eine Youtube URL mit Hilfe von regex:
preg_match('~http://youtube.com/watch\?v=[a-zA-Z0-9-]+~', $videoLink)
Es funktioniert, aber es können match-URL ist fehlerhaft. Zum Beispiel, wird dieses match ok:
http://www.youtube.com/watch?v=Zu4WXiPRek
Aber so wird auch diese:
http://www.youtube.com/watch?v=Zu4WX£&P!ek
Und dies nicht:
http://www.youtube.com/watch?v=!Zu4WX£&P4ek
Ich denke, es ist, weil der +
Betreiber. Es ist passender, was scheint zu sein, das erste Zeichen nach v=
, wenn es braucht, um zu versuchen und passen Sie alles hinter sich v=
mit [a-zA-Z0-9-]
. Jede Hilfe ist willkommen, danke.
- Was du hast sieht gut aus. Sind £, & ! gültige Zeichen in der YouTube-string? Wenn ja, fügen Sie Sie zu Ihren [a-zA-Z0-9-] char Klasse, ansonsten funktioniert das nicht wie gedacht?
- Die + btw, bedeutet: mit diesen Zeichen: [a-zA-Z0-9-] ein-oder mehrmals, so wird es halten, bis es trifft so etwas nicht drin.
- Die einzigen zulässigen Zeichen in einem Youtube-video-ID wie dieser ist a-z, a-Z, 0-9 und -. Daher der Grund, warum ich
[a-zA-Z0-9-]
. Funktioniert es nicht wie gedacht. Ich kann URLs wie:v=Zu4WX£&P!ek
(in diesem Fall £, & und ! sind illegale Zeichen) und es passt Ihnen gut, denn es ist nur die überprüfung der ersten Zeichen nachv=
. - würde es helfen, wenn man mehr Kontext. Wo sind Sie immer die url aus? Ist es von einer vollständigen Seite kratzen und die urls in href="..."? Sie könnte wie [a-zA-Z0-9-]+("|') haben Sie schon die Liste der urls analysiert und Durchlaufen Sie?
- Die URL gesendet wird, wird durch ein Formular durch den Benutzer, und ich brauche, um zu überprüfen, dass eine gültige Youtube-URL, bevor ich senden Sie Anfragen an die Seite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie nicht erfordern eine bestimmte Anzahl von Zeichen in der v= Teil der URL. So ist beispielsweise die überprüfung
entsprechen
und daher true zurück. Sie müssen entweder geben Sie die Anzahl der Zeichen, die Sie brauchen, in der v= Teil:
oder angeben, dass die Gruppe [a-zA-Z0-9-] müssen den letzten Teil der Zeichenfolge:
Ihre anderen Beispiel
nicht entsprechen, weil die + - Zeichen erfordert, dass mindestens ein Charakter muss passen [a-zA-Z0-9-].
[a-zA-Z0-9-]$
hat nicht funktioniert entweder. Es ist einfach false zurückgeben, für alles.[a-zA-Z0-9-]+$
nur ein Tippfehler.Bieten eine alternative, der größer ist und viel weniger elegant als ein regex, sondern arbeitet mit der PHP-native URL-parsing-Funktionen, so dass es vielleicht ein bisschen zuverlässiger in der lange run:
v=
, das ist es, was dieser code extrahiert. Ich brauche es nicht gewonnen, ich muss nur sicherstellen, dass der rest der URL nachv=
wird ergänzt durch[a-zA-Z0-9-]
.&fmt=18
parameter. Sowieso, es ist nur ein alternativer Vorschlag; soweit ich sehen kann, @lonesomeday beantwortet Ihre Frage speficicKurze Antwort:
preg_match('%(http://www.youtube.com/watch\?v=(?:[a-zA-Z0-9-])+)(?:[&"\'\s])%', $videoLink)
Gibt es ein paar Annahmen hier, also lassen Sie mich erklären:
( ... )
um die gesamtehttp://www.youtube.com/watch?v=blah
Teil der Verbindung, so dass wir sagen können "ich möchte, dass man das ganze validiert link bis zu und einschließlich der ?v=movieHash"(?: ... )
um Ihren Charakter festgelegt[a-zA-Z0-9-]
und Links das + - Zeichen, die außerhalb dieses. Dies wird es uns ermöglichen, mit allen zulässigen Zeichen bis zu einem bestimmten Punkt.Am wichtigsten ist, Sie müssen sagen, wie Sie erwarten Ihre Verbindung zu beenden. Ich nehme eine Vermutung, die für Sie mit
(?:[&"\'\s])
?) Wird es im html-format (z.B. Anker-tag) ? Wenn ja, wird der link in href wird natürlich Ende mit einem " oder '.
?) Oder vielleicht gibt es mehr auf die Abfrage-string, so würde es ein & nach dem Wert der v.
?) Gibt es vielleicht ein Leerzeichen oder Zeilenumbruch nach dem Ende der link \s.
Der wichtige Teil ist, dass Sie bekommen können viel genauere Ergebnisse, wenn Sie wissen, was Sie umgibt, was Sie suchen, wie ist der Fall mit vielen regulären Ausdrücken.
Diese non-capturing group (in denen ich mir von Annahmen zu machen, die für Sie nehmen einen Stich an finden Sie ignorieren alle zusätzlichen junk nach, was Sie über Pflege (die ?v=awesomeMovieHash).
Ergebnisse:
"V=..." blob ist nicht garantiert, dass der erste parameter im query-Teil der URL. Ich würde empfehlen mit dem PHP-parse_url () - Funktion brechen Sie die URL in Ihre Bestandteile. Sie können auch wieder zusammenbauen, eine unberührte URL, wenn jemand begann die Zeichenfolge, die mit "https://" oder einfach "youtube.com" statt "www.youtube.com" usw.
Folgende regex passt jedes youtube-link:
youtube-nocookie.com
URLs, noch funktioniert es auf URLs mit einem query-string wie?v=0123456789a&q=18#t=12s
.?-\
. Das heißt, es wird nicht funktionieren, mit vielen regex Aromen, einschließlich PHP preg.