Ich versuche, die Video-ID einer Youtube-URL mit preg_match zu analysieren. Ich habe auf dieser Site einen regulären Ausdruck gefunden, der scheinbar funktioniert.
(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+
Wie auf diesem Bild gezeigt:
Mein PHP sieht wie folgt aus, funktioniert aber nicht (gibt Unbekannten Modifikator "[" -Fehler) ...
<?
$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
print "<pre>";
print_r($matches);
print "</pre>";
?>
Prost
Dieser reguläre Ausdruck bezieht sich auf die ID von allen URLs, die ich finden konnte ... Es gibt vielleicht mehr, aber ich konnte nirgendwo einen Verweis darauf finden. Wenn Sie auf eines stoßen, das nicht übereinstimmt, hinterlassen Sie bitte einen Kommentar mit der URL. Ich werde versuchen, die Regex so anzupassen, dass sie mit Ihrer URL übereinstimmt.
if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
$video_id = $match[1];
}
Hier ist ein Beispiel für die URLs, auf die dieser reguläre Ausdruck passt: (Nach der angegebenen URL kann mehr Inhalt enthalten sein, der ignoriert wird.)
Es funktioniert auch für die URL youtube-nocookie.com mit den gleichen Optionen.
Außerdem wird die ID in einem eingebetteten Code (sowohl iframe- als auch object-Tags) von der URL abgerufen.
Ich musste mich damit für eine PHP -Klasse beschäftigen, die ich vor ein paar Wochen geschrieben habe, und am Ende einen Regex, der für jede Art von Zeichenfolgen geeignet ist: youtu.be URL-Strings und Umgang mit allen Arten von Parametersortierungen. Sie können unter GitHub ausprobieren oder einfach den Code-Block kopieren und einfügen:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @param $url string The string that shall be checked.
* @return mixed Returns YouTube Video ID, or (boolean) false.
*/
function parse_yturl($url)
{
$pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
preg_match($pattern, $url, $matches);
return (isset($matches[1])) ? $matches[1] : false;
}
Um die Regex zu erklären, hier eine gespickte Version:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @param $url string The string that shall be checked.
* @return mixed Returns YouTube Video ID, or (boolean) false.
*/
function parse_yturl($url)
{
$pattern = '#^(?:https?://)?'; # Optional URL scheme. Either http or https.
$pattern .= '(?:www\.)?'; # Optional www subdomain.
$pattern .= '(?:'; # Group Host alternatives:
$pattern .= 'youtu\.be/'; # Either youtu.be,
$pattern .= '|youtube\.com'; # or youtube.com
$pattern .= '(?:'; # Group path alternatives:
$pattern .= '/embed/'; # Either /embed/,
$pattern .= '|/v/'; # or /v/,
$pattern .= '|/watch\?v='; # or /watch?v=,
$pattern .= '|/watch\?.+&v='; # or /watch?other_param&v=
$pattern .= ')'; # End path alternatives.
$pattern .= ')'; # End Host alternatives.
$pattern .= '([\w-]{11})'; # 11 characters (Length of Youtube video ids).
$pattern .= '(?:.+)?$#x'; # Optional other ending URL parameters.
preg_match($pattern, $url, $matches);
return (isset($matches[1])) ? $matches[1] : false;
}
Ich habe Regex aus der Anführer-Antwort perfektioniert. Es holt sich auch die ID von allen URLs, aber richtiger .
if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
$video_id = $match[1];
}
Außerdem werden falsche IDs, die mehr als 11 Zeichen umfassen, korrekt verarbeitet.
http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF
Benutzen
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
Ich habe niemanden gesehen, der den PHP Fehler direkt angesprochen hat, also versuche ich es zu erklären.
Der Grund für den Fehler "Unbekannter Modifizierer" ["" ist, dass Sie vergessen haben, Ihren regulären Ausdruck in Trennzeichen einzuwickeln. PHP nimmt nur das erste Zeichen als Trennzeichen, sofern es sich um ein nicht alphanumerisches Zeichen handelt, das kein Leerzeichen ist ASCII. Also in deiner Regex:
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
PHP denkt, Sie meinten (
als Startbegrenzer. Es findet dann das, was es als das schließende Trennzeichen hält, der nächste )
und nimmt an, dass es sich bei dem Muster um Modifizierer handelt. Sie stellt jedoch fest, dass Ihr erster Mustermodifikator, das nächste Zeichen nach dem ersten )
, [
ist. [
ist offensichtlich kein gültiger Mustermodifikator, weshalb Sie die Fehlermeldung erhalten, die Sie ausführen.
Die Lösung besteht darin, Ihren Regex einfach in Trennzeichen einzuwickeln und sicherzustellen, dass alle Trennzeichen innerhalb des Regex, die Sie wörtlich zusammenbringen möchten, mit Escapezeichen versehen werden. Ich benutze gerne ~
als Trennzeichen, b/c müssen Sie selten mit einem Literal ~
in einer Regex übereinstimmen.
Sie haben vergessen, dem Schrägstrich zu entkommen. Also sollte dieser die Arbeit machen:
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]\/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
Startparameter für BBcode analysieren ( https://developers.google.com/youtube/player_parameters#start )
beispiel: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]
PHP Regex:
'#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim'
replace:
'<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'
verwenden Sie den folgenden Code
$url = "" // here is url of youtube video
$pattern = getPatternFromUrl($url); //this will retun video id
function getPatternFromUrl($url)
{
$url = $url.'&';
$pattern = '/v=(.+?)&+/';
preg_match($pattern, $url, $matches);
//echo $matches[1]; die;
return ($matches[1]);
}
das hat für mich funktioniert.
$yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla';
$videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url));