我有以下字符串:
this is a video [youtube erfsdf3445] test
this is a video [youtube we466f] test
我正在尝试构建一个正则表达式,用相应的YouTube视频链接替换[youtube erfsdf3445]
,例如www.youtube.com/watch?v=erfsdf3445
。方括号中的文字用于视频ID。
我该如何做到这一点?
答案 0 :(得分:4)
您正在寻找的正则表达式是/\[youtube ([^\]]+)\]/
。
<强>尸检强>:
\[
文字[
字符 youtube[space]
文字字符串“youtube”(带空格) ([^\]]+)
一个捕获组(这是$1
):
[^\]]+
任何非\]
的字符(文字]
)匹配1次或多次(不能为空) \]
文字]
字符 <强> Debuggex 强>:
代码:
如果您不想进行任何网址编码,只需使用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"
?>
另一方面 - 如果您执行想要使用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"
?>
如果您使用低于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"
?>