2011-11-06 23 views
4

我希望在我的聊天应用程序中,可以点击链接到网站,并链接到YouTube和图像自动嵌入。正则表达式PHP - 自动检测YouTube,图像和“常规”链接

我已经在Java中为我的WebIRC客户端创建了这段代码,但现在我正在尝试使用PHP和JavaScript。

我还不熟悉PHP,所以我不太了解在那里使用正则表达式。我不知道如果某种灵魂可以帮助我解决这个...

对于YouTube上啄我想这没有成功:

if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $message, $m)) { 
    $video_id = $m[1]; 
    $message = preg_replace("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#","<iframe class='embedded-video' src='http://www.youtube.com/embed/" . $video_id . "' allowfullscreen></iframe>",$message); 
} 
+0

更换

if(strpos($arr[0], 'http://') !== 0) 

请给你想匹配 – OMGKurtNilsen

+0

网址以.jpg结尾的网址的范例|| .gif || .png sohuld是嵌入图像。 YouTube视频(http://www.youtube.com/watch?v=XnWyrdBX08w&feature=feedu)应该提取视频ID(在这种情况下是XnWyrdBX08w),并将其如上所述放在iframe中。所有其他网址应该是可点击的链接() –

回答

12

这里是我想出了一个解决方案:

$str = 'This is an image: google.ca/images/srpr/logo3w.png 

YouTube: http://www.youtube.com/watch?v=V2b8ilapFrI&feature=related 

Stackoverflow: http://stackoverflow.com/'; 

$str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:\S+\.\S+)#', function($arr) 
{ 
    if(strpos($arr[0], 'http://') !== 0) 
    { 
     $arr[0] = 'http://' . $arr[0]; 
    } 
    $url = parse_url($arr[0]); 

    // images 
    if(preg_match('#\.(png|jpg|gif)$#', $url['path'])) 
    { 
     return '<img src="'. $arr[0] . '" />'; 
    } 
    // youtube 
    if(in_array($url['host'], array('www.youtube.com', 'youtube.com')) 
     && $url['path'] == '/watch' 
     && isset($url['query'])) 
    { 
     parse_str($url['query'], $query); 
     return sprintf('<iframe class="embedded-video" src="http://www.youtube.com/embed/%s" allowfullscreen></iframe>', $query['v']); 
    } 
    //links 
    return sprintf('<a href="%1$s">%1$s</a>', $arr[0]); 
}, $str); 

让我知道你是否需要我为你澄清任何事情。

+1

尼斯=)得到爱正则表达式回调。 – Rudie

2

当文本包含三个点...时,我遇到了一些与preg_replace_callback有关的问题。上面的代码认识到这三个点是不正确的URL。

这是我的修正,似乎在此刻$str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:jpe?g|png|gif)#', function($arr)

上班这会修复失败在其他情况下???