0

我需要从 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。谁能帮我解决这个问题?

4

1 回答 1

3

你最好的选择是使用插件扩展 Smarty,特别是修改器。

您可以按照这里的讨论找出从 youtube URL 获取 ID 的最佳方法;实际上,仅使用正则表达式来解释不同类型的 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 而没有其他数据,否则您必须修改表达式。)

于 2013-08-18T01:47:21.643 回答