从smarty模板中的youtube url获取youtube视频id


Get youtube video id from youtube url in smarty template?

我需要解析并从smarty tpl文件中的youtube url中获取youtube视频id。现在我正在使用插件文件来实现这一点,使用php-preg_match函数。但我想用Smarty正则表达式来解析,而不是用上面的方法。

由于我通过smarty循环获取视频URL,我无法在php中解析它并在smarty中分配。目前我正在使用此代码从smarty的PHP插件文件中获取视频id。

if ($videoURL) {            
if (preg_match('%(?:youtube(?:-nocookie)?'.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu'.be/)([^"&?/ ]{11})%i', $videoURL, $match)) {
     $video_id = $match[1];
    }
     if (false !== $video_id) {
       return $video_id;
     }
     return false;
}

我不知道如何将这个preg_match转换为smarty。有人能帮我解决这个问题吗?

您最好的选择是使用插件,特别是修饰符来扩展Smarty。

你可以在这里进行讨论,找出从youtube URL获取ID的最佳方法;事实上,仅仅使用regex来解释不同类型的URL是相当棘手的(因此上面有一个巨大的表达式。)

例如:

<?php 
function smarty_modifier_youtubeID($string) { 
    parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
    return $my_array_of_vars['v']; 
}

然后将以上内容放到smarty的plugins/目录中,名称类似modifier.youtube.php。然后继续在for循环中使用它(在模板文件中),就像{$value|youtubeID} 一样

另一种选择,我感觉你在追求,就是这样做:

{$value|regex_replace:"/^(?:http(?:s)?:'/'/)?(?:www'.)?(?:youtu'.be'/|youtube'.com'/(?:(?:watch)?'?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)'/))([^'?&'"'>]+)/":'$1'} 

以上内容将用视频ID替换URL(假设$value仅由youtube URL组成,没有其他数据,否则您将不得不修改表达式。)