duanjiwu0324 2014-02-26 16:38
浏览 8
已采纳

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

I have the following strings:

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

I'm trying to build a regular expression that replaces [youtube erfsdf3445] with the the corresponding YouTube video link, for example www.youtube.com/watch?v=erfsdf3445. The text enclosed in square brackets is used for video ID.

How can I accomplish this?

  • 写回答

1条回答 默认 最新

  • douzhangbao2187 2014-02-26 16:42
    关注

    The regex you are looking for is /\[youtube ([^\]]+)\]/.

    Autopsy:

    • \[ a literal [ character
    • youtube[space] the literal string "youtube " (with a space)
    • ([^\]]+) a capturing group (this is $1):
      • [^\]]+ any character that isn't \] (that's a literal ]) matched 1 or more times (can't be empty)
    • \] a literal ] character

    Debuggex:

    Regular expression visualization

    In code:

    If you don't want to do any URL encoding, you can simply use 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


    On the other hand - if you do want to use URL encoding and you use PHP 5.3+ you can use preg_replace_callback with an anonymous function:

    <?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


    If you use anything less than PHP 5.3, you can still use preg_replace_callback, just not with an anonymous function:

    <?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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法