Парсинг Youtube ссылки автоматически - PullRequest
8 голосов
/ 07 июня 2011
$message = preg_replace("#(http://(www.)?youtube.com)?/(v/|watch\?v\=)([-|~_0-9A-Za-z]+)&?.*?#i", "<iframe title=\"YouTube\" width=\"480\" height=\"390\" src=\"http://www.youtube.com/embed/$4\" frameborder=\"0\" allowfullscreen></iframe>", $message);

Это прекрасно работает, если ссылка на YouTube выглядит следующим образом:

http://www.youtube.com/watch?v=9DhSwsbKJQ4

но есть проблема, если ссылка на Youtube выглядит следующим образом:

http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music

Результат - iframe и текст feature=topvideos_music после iframe. Есть ли способ как все удалить после & в ссылке на Youtube?

Ответы [ 8 ]

3 голосов
/ 07 июня 2011

Почему вы не используете функции parse_url() и parse_str()?Это гораздо более безопасное решение.

$url = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
// $url = 'http://www.youtube.com/v/9DhSwsbKJQ4?feature=topvideos_music';

$parsedUrl = parse_url($url);
parse_str($parsedUrl['query'], $parsedQueryString);

// URL in ?v=... form
if (isset($parsedQueryString['v'])) {
    $id = $parsedQueryString['v'];
}
// URL in /v/... form
else if (substr($parsedUrl['path'], 0, 3) == '/v/') {
    $id = substr($parsedUrl['path'], 3);
}
// invalid form
else {
    throw new ...;
}
2 голосов
/ 07 июня 2011

Вам лучше разложить URL с помощью parse_url () / parse_str (), а затем перестроить его с нуля.

$url = 'http://www.youtube.com/....';

$url_parts = parse_url($url);

$query_parts = parse_str($parts['query']);

$v = $query_parts['v'];

$new_url = $url_parts['scheme']; // http
$new_url .= '://';
$new_url .= $url_parts['host']; // www.youtube.com
$new_url .= '/';
$new_url .= $url_parts['path']; // /
$new_url .= '?'
$new_url .= 'v' . $v; // v=....

Хотя анализ с помощью регулярного выражения будет работать, в какой-то момент он обернется и укусит вас. Это немного утомительнее, но безопаснее в долгосрочной перспективе.

1 голос
/ 15 декабря 2011

Короткая версия.

$url = 'url_text';
$vidparser = parse_url($url);
parse_str($vidparser[query], $query);
$video_id = ($query['v']); 
1 голос
/ 07 июня 2011

Регулярные выражения

Я ни в коем случае не regex-pert, но следующее удаляет амперсанд и все следующее:

$vidpath = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
echo preg_replace('/&.+/', '', $vidpath);

Производит http://www.youtube.com/watch?v=9DhSwsbKJQ4.

Удар по кусочкам!

Другой вариант - использовать explode() и разбивать строку на основе вхождений &, в результате чего получается массивгде индекс 0 содержит желаемый результат.

echo array_shift( explode( '&', $vidpath ) );

В этом случае array_shift() вернет любой элемент с индексом 0, который будет вашим путем.

0 голосов
/ 07 июня 2011

Вы можете, как упоминалось ранее, сначала получить все до &, или вы можете просто сделать следующее (только набрав регулярное выражение для удобства).

#(http://(www.)?youtube.com)?/(v/|watch\?v\=)([-|~_0-9A-Za-z]+)#i

, чтобы сделать его более общим, вы можете сделать следующее:

#(:?(:?(:?www\.)?youtube\.(:?[^/]{2,5})/(:?v/|watch\?v\=))|(:?youtu.be/))([-|~_0-9A-Za-z]+)#

Регулярному выражению не нужно соответствовать всему.Все :? , которые должны избегать preg_replace для сохранения ссылки, и при этом она должна также соответствовать сокращенным URL-адресам.В этом случае ссылка будет храниться в $1.

0 голосов
/ 07 июня 2011

Попробуйте pathinfo ()

изменить после комментария: попробуйте выполнить это:

<code><?php
$url='http://www.site.com/foo/bar.php?dummy=param&dummy2=param2';
$array=pathinfo($url);
?><pre><?php print_r($array); ?>
«;echo $ eacharray [1];// значение echo '«;}?>

вывод будет:

Array
(
    [dirname] => http://www.site.com/foo
    [basename] => bar.php?dummy=param&dummy2=param2
    [extension] => php?dummy=param&dummy2=param2
)
dummy
param
dummy2
param2

Не идеальный пример, но вы можете получить все ключи / значения с помощью этого метода.

edit2: извините, я спешил, перередактировал мой пост, чтобы точно, что вам нужно.

<?php
//code partially taken from php.net
$character='&';
$string='http://www.youtube.com/watch?v=asd123&feature=related&dummytext=true';
$whole_length = strlen($string); 
$right_length = (strlen(strstr($string, $character)) - 1); 
$left_length = ($whole_length - $right_length - 1); 

$piece = substr($string, 0, ($left_length));

echo $piece; //http://www.youtube.com/watch?v=asd123

?>
0 голосов
/ 07 июня 2011

Если вам нужен только идентификатор видео, я предлагаю переключиться на регулярное выражение, например:

/(http\:\/\/(www\.)?youtube\.com)\/watch\?v=([^&]+)/ism

Протестировано на regextester.com

0 голосов
/ 07 июня 2011

Да. Попробуйте использовать этот код перед вашим:

$message = 'http://www.youtube.com/watch?v=9DhSwsbKJQ4&feature=topvideos_music';
$message = explode( '&' , $message);
$message = $message[0];

Теперь переменная $message установлена ​​в http://www.youtube.com/watch?v=9DhSwsbKJQ4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...