将方括号内的视频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?

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