以下代码适用于除youtu.be
以外的所有YouTube域。一个例子是:http://www.youtube.com/watch?v=ZedLgAF9aEg
会转变为:ZedLgAF9aEg
我的问题是如何才能使其与http://youtu.be/ZedLgAF9aEg
一起使用。
我对正则表达式并不是很好,所以非常感谢你的帮助。我的代码是:
$text = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $text)); }
$text = (htmlentities($text, ENT_QUOTES, 'UTF-8'));
再次感谢!
答案 0 :(得分:2)
//$url = 'http://www.youtube.com/watch?v=ZedLgAF9aEg';
$url = 'http://youtu.be/ZedLgAF9aEg';
if (FALSE === strpos($url, 'youtu.be/')) {
parse_str(parse_url($url, PHP_URL_QUERY), $id);
$id = $id['v'];
} else {
$id = basename($url);
}
echo $id; // ZedLgAF9aEg
适用于两种版本的网址。 不要使用正则表达式,因为PHP内置了解析URL的函数,正如我所演示的那样,它们更快,更强大,可以防止破坏。
答案 1 :(得分:2)
你的正则表达式似乎解决了现在的问题?我没有在php中尝试它,但它似乎在我的编辑器中工作正常。
正则表达式的第一部分http://(?:www\.)?youtu\.?be(?:\.com)?/
与http://youtu.be/
匹配,第二部分(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)
以|)
结尾,这意味着它匹配 nothing (制作它是可选的)。换句话说,它会削减http://youtu.be/
只留下id。
更直观的写作方式是将整个if grouping分组设为可选的,但据我所知,你的正则表达式已经解决了你的问题:
#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=)?#i
注意:您的正则表达式也适用于www.youtu.be.com
域。如果您使用它来验证输入,它会被剥离,但需要注意的事项。
<强>更新强>
如果您只想匹配[youtube][/youtube]
代码中的网址,则可以使用look arounds。
有点像:
(?<=\[youtube\])(?:http://(?:www\.)?youtu\.?be(?:\.com)?/(?:embed/|watch\?v=|\?v=|v/|e/|[^\[]+/|watch.*v=)?)(?=.+\[/youtube\])
您可以通过使前瞻中的.+
仅匹配有效的网址字符等来进一步优化它。
答案 2 :(得分:0)
试试这个,希望它能帮到你
function YouTubeUrl($url)
{
if($url!='')
{
$newUrl='';
$videoLink1=$url;
$findKeyWord='youtu.be';
$toBeReplaced='www.youtube.com';
if(IsContain('watch?v=',$videoLink1))
{
$newUrl=tMakeUrl($videoLink1);
}
else if(IsContain($videoLink1, $findKeyWord))
{
$videoLinkArray=explode('/',$videoLink1);
$Protocol='';
if(IsContain('://',$videoLink1))
{
$protocolArray=explode('://',$videoLink1);
$Protocol=$protocolArray[0];
}
$file=$videoLinkArray[count($videoLinkArray)-1];
$newUrl='www.youtube.com/watch?v='.$file;
if($Protocol!='')
$newUrl.=$Protocol.$newUrl;
else
$newUrl=tMakeUrl($newUrl);
}
else
$newUrl=tMakeUrl($videoLink1);
return $newUrl;
}
return '';
}
function IsContain($string,$findKeyWord)
{
if(strpos($string,$findKeyWord)!==false)
return true;
else
return false;
}
function tMakeUrl($url)
{
$tSeven=substr($url,0,7);
$tEight=substr($url,0,8);
if($tSeven!="http://" && $tEight!="https://")
{
$url="http://".$url;
}
return $url;
}
答案 3 :(得分:0)
您可以对任何youtube网址
使用bellow功能我希望这会对你有所帮助
function checkYoutubeId($ id)
{
$ youtube =“http://www.youtube.com/oembed?url=”。 $ id。“&amp; format = json”;
$ curl = curl_init($ youtube);
curl_setopt($ curl,CURLOPT_RETURNTRANSFER,1);
$ return = curl_exec($ curl);
curl_close($卷曲);
返回json_decode($ return,true);
}
如果Id与YouTube视频ID匹配,此功能会返回Youtube视频详细信息
答案 4 :(得分:0)
@rvalvik答案的一点改进是包括移动链接的情况(我在与使用iPad导航,复制和粘贴链接的客户合作时注意到了这一点)。在这种情况下,我们有一个m
(移动)字母而不是www
。然后正则表达式成为:
#(https?://)?(?:www\.)?(?:m\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch?.*?v=))([\w\-]{10,12}).*#x
希望它有所帮助。
答案 5 :(得分:0)
另一个答案略有改善:
if (strpos($url, 'feature=youtu.be') === TRUE || strpos($url, 'youtu.be') === FALSE )
{
parse_str(parse_url($url, PHP_URL_QUERY), $id);
$id = $id['v'];
}
else
{
$id = basename($url);
}
这考虑到youtu.be仍然在URL中,但不是URL本身(确实发生了!),因为它可能是引用功能链接。
答案 6 :(得分:0)
其他答案忽略了一些 youtube 链接是播放列表的一部分,并且还具有嵌入代码所需的列表参数。所以要从链接中提取嵌入代码,可以试试这个 JS 代码:
let urlEmbed = "https://www.youtube.com/watch?v=iGGolqb6gDE&list=PL2q4fbVm1Ik6DCzm9XZJbNwyHtHGclcEh&index=32"
let embedId = urlEmbed.split('v=')[1];
let parameterStringList = embedId.split('&');
if (parameterStringList.length > 1) {
embedId = parameterStringList[0];
let listString = parameterStringList.filter((parameterString) =>
parameterString.includes('list')
);
if (listString.length > 0) {
listString = listString[0].split('=')[1];
embedId = `${parameterStringList[0]}?${listString}`;
}
}
console.log(embedId)
答案 7 :(得分:-2)
试试这个:
$string = explode("=","http://www.youtube.com/watch?v=ZedLgAF9aEg");
echo $string[1];
会变成:ZedLgAF9aEg