2011-01-13 160 views
0

我试图扫描链接到某些视频共享网站的文本,因此我可以在视频链接时创建嵌入式播放器。与视频分享网站的链接

这是我到目前为止有:

function extract(&$text) { 
    // Scans text for links to YouTube, Vimeo, DailyMotion. 

    // *keep ~discard 
    // youtube.com/watch?v=[*alphanumeric]&[~whatever] 
    // youtube-nocookie.com/watch?v=[*alphanumeric]&[~whatever] 
    // vimeo.com/[*numeric] 
    // dailymotion.com/video/[*alphanumeric]_[~whatever] 

    $sites = 'youtube\.com|youtube-nocookie\.com|vimeo\.com|dailymotion\.com'; 
    $regex = '/^(http|https):\/\/(www\.|)(' . $sites . ')\/.*/'; 
    preg_match_all($regex, $text, $videos); 
    return $videos; 
} 

这是工作古怪。它发现了下面的文字没有结果:

And what about YouTube videos? 

http://www.youtube.com/timminchin#p/a/u/2/zkGEbRrNNtE 

http://www.youtube.com/timminchin#p/a/f/1/zU4iyjoVWQ 

http://www.youtube.com/watch?v=XzU4iyjoVWQ 

http://www.youtube-nocookie.com 

它发现这段文字一个结果:

http://youtube.com/watch?v=XzU4iyjoVWQ 

https://www.youtube.com/watch?v=XzU4iyjoVWQ 

和其上只包含一个链接,并没有其他的文本工作正常。

我不像使用正则表达式那样使用正则表达式,并且使用http://www.strfriend.com来帮助我构建这个模型。我想要的只是一个URL数组。

回答

0

正则表达式更改为以下:

/(http|https):\/\/(www\.|)(' . $sites . ')\/[^\s]*/ 

差异:

在一开始^使得正则表达式只看该文本的开头,而不是随处可见。

[\s]在开始时确保您可以在一行文本中找到两个链接。

将不会找到最后一个URL,因为URL末尾没有结尾的斜杠。如果您尝试检测视频,但这并不重要,因为视频始终位于子页面上。

+0

经过测试。完美的作品。现在,嵌入的视频会附加到论坛中帖子的末尾。可爱。 – TRiG 2011-01-13 14:51:28