php youtube和链接正则表达式正在组合,反过来渲染无用

时间:2013-08-25 21:13:32

标签: php regex iframe youtube

我的网站上有一个可以嵌入链接和youtube视频的发布功能。问题是,两者发生冲突,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);

1 个答案:

答案 0 :(得分:1)

此问题的常用解决方案是使用占位符。在第一次传递时,您将所有YouTube链接转换为占位符,例如:

{{youtube:VhqiT2nWCVU}}

之后运行普通的链接转换器。最后,你运行另一个正则表达式,将所有掌控者转变为youtube嵌入。