web-dev-qa-db-de.com

youtube-ID mit preg_match analysieren

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:

alt text

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

60
J.C

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.

220
Benjam

Verwenden Sie parse_url und parse_str , um die URL und die Abfragezeichenfolge zu analysieren:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);
11
Gumbo

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;
}
7
eyecatchUp

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

5
Modder

Benutzen

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
2
Dogbert

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.

1
m4olivei

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);
1
Novan Adrian

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>'
1
Fixer

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]);
}
0
diEcho

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));
0
T.Todua