preg_match - что не так с этим кодом?

0

$message содержит два разных видео Youtube. Приведенный ниже код работает, но проблема в том, что конечный результат создает два фрейма с одинаковым идентификатором видео (первое видео). Как я могу решить эту проблему?

$message = 'This is a text with 2 Youtube videos: https://www.youtube.com/watch?v=rxwMjB-Skao csassasas http://www.youtube.com/watch?v=VWEwWECAokU Enf of text';

$reg_exUrl_youtube = "/(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'> \r\n]+)(?![^<]*>)/";
if (preg_match($reg_exUrl_youtube, $message, $youtubeUrlData) ) {
$message = preg_replace($reg_exUrl_youtube, "<iframe title=\"{$youtubeUrlData[1]}\" class=\"youtube\" src=\"[qqqqq].youtube.com/embed/{$youtubeUrlData[1]}\" frameborder=\"0\" allowFullScreen></iframe>", $message);
}
  • 0
    Нет необходимости проверять строку с помощью preg_match !
Теги:
preg-match

2 ответа

1
Лучший ответ

1) Исправление для вашего кода заключается в использовании $ 1 вместо {$ youtubeUrlData [1]} в вызове preg_replace():

$message = preg_replace($reg_exUrl_youtube, "<iframe title=\"$1\" class=\"youtube\" src=\"[qqqqq].youtube.com/embed/$1\" frameborder=\"0\" allowFullScreen></iframe>", $message);

2) Еще одна реализация с preg_replace_callback(), которая очень надежна из моего опыта, как пример:

$message = 'This is a text with 2 Youtube videos: https://www.youtube.com/watch?v=rxwMjB-Skao csassasas http://www.youtube.com/watch?v=VWEwWECAokU Enf of text';

$reg_exUrl_youtube = "/(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'> \r\n]+)(?![^<]*>)/";

$finalString = preg_replace_callback($reg_exUrl_youtube, function($matches) {
    return "<iframe title=\"{$matches[1]}\" class=\"youtube\" src=\"[qqqqq].youtube.com/embed/{$matches[1]}\" frameborder=\"0\" allowFullScreen></iframe>";
}, $message);

echo htmlentities($finalString);
-1

Зачем использовать регулярное выражение с ошибкой?

Гораздо проще:

$message = 'This is a text with 2 Youtube videos: https://www.youtube.com/watch?v=rxwMjB-Skao csassasas http://www.youtube.com/watch?v=VWEwWECAokU Enf of text';

$a=explode(' ',$message);
foreach($a as $v){
    if(strpos($v,'http')!==false && strpos($v,'youtube')!==false){
    $res[]=$v;
    }
}   
echo var_dump($res);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню