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 [
characteryoutube[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 ]
characterDebuggex:
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"
?>
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"
?>
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"
?>