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