您可以构建主机名和闭包映射:
$tubes = array(
'youtube.com' => function($parsed_url) {
//$parsed_url contains data as returned by parse_url()
},
'youtu.be' => function($parsed_url) {
//
},
);
然后使用正则表达式解析内容,获取 URL,并通过对地图中适当元素的调用传递它们。
这种方法更通用,因为你不限于youtube,你可以很容易地为任何主机添加助手,包括vimeo和天知道,当需要弹出时。
示例工作实现,剩下的交给你:
<?php
$text = 'http://youtube.com/watch?v=9YgjZ4oPrj4
http://youtu.be/9YgjZ4oPrj4';
$tubes = array(
'youtube.com' => function($parse_url) {
parse_str($parse_url['query'], $query);
return "<iframe width='560' height='315' src='http://www.youtube.com/embed/$query[v]' frameborder='0' allowfullscreen></iframe>";
},
);
$replace = function($matches) use ($tubes) {
$url = parse_url($matches[0]);
if(isset($tubes[$url['host']])) {
return $tubes[$url['host']]($url);
}
return $matches[0];
};
$matches = preg_replace_callback('/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/', $replace, $text);
var_dump($matches);
如果您需要新的启发式方法,只需将它们添加到$tubes
地图中即可。