私のサイトには、リンクや YouTube ビデオを埋め込むことができる投稿機能があります。問題は、2 つが衝突し、YouTube の iframe が私のサイトの 404 ページになってしまうことです。YouTubeのビデオとリンクの私のコードは以下にありますが、それらが結合して台無しになるのを止める方法がわかりません.
組み合わせるとは、これがhttp://www.youtube.com/watch?v=VhqiT2nWCVUに変わり、
<iframe src="http://www.youtube.com/watch?v=VhqiT2nWCVU">
次に変わることを意味します
<iframe src="<a href="http://www.youtube.com/watch?v=VhqiT2nWCVU"></a>">
不明な点がありましたら申し訳ありません。私のコードは以下です。
function youtube($string)
{
return preg_replace(
'#(http://(www.)?youtube.com)?/(v/|watch\?v\=)([-|~_0-9A-Za-z]+)&?.*?#i',
'<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/$4?rel=0" frameborder="0" allowfullscreen></iframe>',
$string
);
}
$posted = youtube($posted);
$rexProtocol = '(https?://)?';
$rexDomain = '((?:[-a-zA-Z0-9]{1,63}\.)+[-a-zA-Z0-9]{2,63}|(?:[0-9]{1,3}\.){3}[0-9]{1,3})';
$rexPort = '(:[0-9]{1,5})?';
$rexPath = '(/[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]*?)?';
$rexQuery = '(\?[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?';
$rexFragment = '(#[!$-/0-9:;=@_\':;!a-zA-Z\x7f-\xff]+?)?';
// Solution 1:
function callback($match)
{
// Prepend http:// if no protocol specified
$completeUrl = $match[1] ? $match[0] : "http://{$match[0]}";
return '<a href="' . $completeUrl . '">'
. $match[2] . $match[3] . $match[4] . '</a>';
}
$posted = preg_replace_callback("&\\b$rexProtocol$rexDomain$rexPort$rexPath$rexQuery$rexFragment(?=[?.!,;:\"]?(\s|$))&",
'callback', $posted);