我正在尝试基本上提取youtube.com网址的?v =(查询部分)...当有人在youtube.com URI中输入时会自动嵌入视频(即有人会输入{ {3}},此程序应自动将其嵌入页面中。
无论如何,当我运行以下代码时,我得到两个QUERY(ies)作为第一个URI:
<?php
//REGEX CONTROLLER:
//embedding youtube:
function youtubeEmbedd($text)
{
//scan text and find:
// http://www.youtube.com/
// www.youtube.com/
$youtube_pattern = "(http\:\/\/www\.youtube\.com\/(watch)??\?v\=[a-zA-Z0-9]+(\&[a-z]\=[a-zA-Z0-9])*?)"; // the pattern
#"http://www.youtube.com/?v="
echo "<hr/>";
$links = preg_match_all($youtube_pattern, $text, $out, PREG_SET_ORDER); // use preg_replace here
if ($links)
{
for ($i = 0; $i != count($out); $i++)
{
echo "<b><u> URL </b><br/></u> ";
foreach ($out[$i] as $url)
{
// split url[QUERY] here and replaces it with embed code:
$youtube = parse_url($url);
echo "QUERY: " . $youtube["query"] . "<br/>";
#$pos = strpos($url, "?v=");
}
}
}
else
{
echo "no match";
}
}
youtubeEmbedd("tthe quick gorw fox http://www.youtube.com/watch?v=5qm8PH4xAss&x=4dD&k=58J8 and http://www.youtube.com/?v=Dd3df4e ");
?>
输出是:
URL QUERY: v=5qm8PH4xAss QUERY: << WHY DOES THIS APPEAR???????????? URL QUERY: v=Dd3df4e
我会很乐意帮助你。
答案 0 :(得分:2)
您的正则表达式将结果存储在$out
中,如下所示:
(
[0] => Array
(
[0] => http://www.youtube.com/watch?v=5qm8PH4xAss
[1] => watch
)
[1] => Array
(
[0] => http://www.youtube.com/?v=Dd3df4e
)
)
您的正则表达式有一个用于匹配文本watch
的子组,因此最终会导致数组中的结果。
由于您遍历所有结果$out[$i]
,因此您尝试在第一个匹配的第二个结果上运行parse_url
;这导致空输出。
要解决您的问题,只需将迭代更改为:
if($links){
foreach($out as $result){
$youtube = parse_url($result[0]);
echo "<b><u> URL </b><br/></u> QUERY: " . $youtube["query"] . "<br/>";
}
}