php字符串搜索 - 抓取特定网址

时间:2011-02-10 15:06:00

标签: php string

我有这个字符串,可能包含一些我需要抓取的网址。例如,如果用户执行:

  

www.youtube ...

  

www.vimeo ...

  

http://www.youtube ...

  

HttP://WwW.viMeo

我需要抓住它(直到他找到一个空间)。并将其存储在已创建的数组中。

需要将vimeo链接与youtube链接分开,并将每个链接放在相应的视频对象上。

我不确定这是否可行,我的意思是,如果来自浏览器的URL可以用于放置在预定义的视频对象上。如果是,那么这就是要走的路(所以我相信)。

如果所有这些都可行,我可以帮助您制定这样的规则吗?

提前致谢

2 个答案:

答案 0 :(得分:5)

这匹配您需要的链接,并按站点名称将它们存储在2D数组中:

$video_links = array();
if (preg_match_all("'(http://)?(www[.])?(youtube|vimeo)[^\s]+'is",$str,$n)) {
    foreach ($n[3] as $key => $site)
    {
        $video_links[$site][] = $n[0][$key];
    }
}

这是做什么的?

此匹配将$str中所需网址的3 + 1部分分开,这是您的字符串:

  • 第0部分:整场比赛(您的视频链接)
  • 第1部分:http://(可选)
  • 第2部分:www.(可选)
  • 第3部分:vimeoyoutube

preg_match_all返回一个2D数组,其中第一级包含上述部分编号,内部的每个匹配都是每个匹配的一部分。所以你迭代匹配的第3部分($n[3]),并使用数组键来引用第0部分($n[0][$key]),并将它们安排在一个漂亮的2D数组中,如下所示:

$video_links = array (
    'vimeo' => array (
        0 => 'vimeo link 1',
        1 => 'vimeo link 2',
        // ...
    ),
    'youtube' => array (
        0 => 'youtube link 1',
        1 => 'youtube link 2',
        // ...
    )
);

答案 1 :(得分:1)

你应该做的是首先将所有http://www.的实例替换为空,然后将其重新添加到字符串中,这使字符串保持一致

str_replace(array("http://www.","http://"),"",$url);
$url = "http://" . $url;

然后您可以使用parse_url来检查数据

$Data = parse_url($url);

然后只需相应检查您的值。

switch(strtolower($Data['host']))
{
    case "youtube.com":
        // :)
    break;
    case "vimeo.com":
        // :)
    break;
    case "something.tld":
        // :)
    break;
}

$Data的转储将输出如下内容:

[scheme] => http
[host] => youtube.com
[user] => 
[pass] => 
[path] => /watch
[query] => v=r8FVAHuQvjc&feature=topvideos
[fragment] =>

你现在可以去

$lastSegment = $Data["path"] . "?" . $Data["query"];

会返回类似/watch?v=r8FVAHuQvjc&feature=topvideos

的内容

如果你想要查询中的单个项目,例如视频ID,那么你可以去:

parse_str($Data["query"],$result);
echo $result["v"];

只会输出视频ID。