将方括号内的视频ID转换为YouTube视频链接

时间:2014-02-26 16:38:39

标签: php regex

我有以下字符串:

this is a video [youtube erfsdf3445] test
this is a video [youtube we466f] test

我正在尝试构建一个正则表达式,用相应的YouTube视频链接替换[youtube erfsdf3445],例如www.youtube.com/watch?v=erfsdf3445。方括号中的文字用于视频ID。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:4)

您正在寻找的正则表达式是/\[youtube ([^\]]+)\]/

<强>尸检

  • \[ 文字[字符
  • youtube[space] 文字字符串“youtube”(带空格)
  • ([^\]]+) 一个捕获组(这是$1):
    • [^\]]+ 任何非\]的字符(文字])匹配1次或多次(不能为空)
  • \] 文字]字符

<强> Debuggex

Regular expression visualization

代码

如果您不想进行任何网址编码,只需使用preg_replace

即可
<?php
    $string = 'this is a video [youtube erfsdf3445] test';

    $string = preg_replace('/\[youtube ([^\]]+)\]/', 'http://www.youtube.com/watch?v=$1', $string);

    var_dump($string);
    //string(62) "this is a video http://www.youtube.com/watch?v=erfsdf3445 test"
?>

DEMO


另一方面 - 如果您执行想要使用URL编码并使用PHP 5.3+,则可以使用preg_replace_callback匿名函数:

<?php
    $string = 'this is a video [youtube erfsdf3445] test';

    $string = preg_replace_callback('/\[youtube ([^\]]+)\]/', function($match) {
        return 'http://www.youtube.com/watch?v=' . urlencode($match[1]);
    }, $string);

    var_dump($string);
    //string(62) "this is a video http://www.youtube.com/watch?v=erfsdf3445 test"
?>

DEMO


如果您使用低于PHP 5.3的任何内容,您仍然可以使用preg_replace_callback,而不是使用匿名函数:

<?php
    $string = 'this is a video [youtube erfsdf3445] test';

    function replace_youtube_callback($match) {
        return 'http://www.youtube.com/watch?v=' . urlencode($match[1]);
    };

    $string = preg_replace_callback('/\[youtube ([^\]]+)\]/', 'replace_youtube_callback', $string);

    var_dump($string);
    //string(62) "this is a video http://www.youtube.com/watch?v=erfsdf3445 test"
?>

DEMO