ホスト名とクロージャーのマップを作成できます。
$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
マップに追加するだけです。