2011-02-11 55 views
0

我一直在考虑下面的正则表达式:preg_match_all - 正则表达式的帮助

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

但是,如果我有这样的字符串:

“你好,看我的VIMEO视频这里: http://www.vimeo.com..../非常好的HM?“

除了只接收url,我还得到了vimeo这个词。

我相信正则表达式正在回顾它应该更多,我只想回顾它发现的网址,而不是每个“vimeo”或“youtube”的引用。

我可以请求您的帮助,以缩小此表达式的范围,以便只检索网址吗?

+1

尝试将`[S \ S] +`改为`\ S +`(大写`S`,这意味着除白色空间之外的所有东西... – ircmaxell 2011-02-11 17:54:21

+1

我不想试图回答这个问题(因为几个人已经),但我想提供一个伟大的网站来测试RegEx:http://gskinner.com/RegExr/ - 它帮了我很多次! – 2011-02-11 18:40:32

+0

@ s992 - 它直接到我的最爱,感谢分享。 – MEM 2011-02-12 11:17:42

回答

1

也许下面的代码可以帮助了一点:

<?php 
    //Test string 
    $prova = "\"hello, look at my <strong>vimeo</strong> video here: <a href=\"http://www.vimeo.com..../\" rel=\"nofollow\">http://www.vimeo.com..../</a> very nice hm?\""; 
    $prova .= " vimeo vimeo.com/something?id=somethingcrazy&testing=true "; 
    //if we match then capture all matches 
    if (preg_match_all("'(http://)?(www\.)?(youtube|vimeo)\.([a-z0-9_/?&+=.]+)'is",$prova,$n)){ 
     foreach ($n[0] as $key => $site){ 
      //for each match that matched the whole pattern 
      //save the match as a site 
      $video_links[$site][] = $n[0][$key]; 
     } 
    } 
    //display results 
    print_r($video_links); 
?> 

这将不匹配的话VIMEO。它将匹配vimeo.com/something?id=somethingcrazy & testing = true,它将匹配http://www.vimeo.com..../两次。

2

正则表达式中的第一个问号?是不需要的。它使前面的搜索字符串可选,因此也匹配文本中的单词vimeo。尝试:

preg_match_all("'(http://)(www[.])?(youtube|vimeo)[.][^\s]+'is", 

提示:在末尾添加(?<![,.)])如果要排除典型的标点符号经常搞砸了这样的网址搜索。


作为替代方案,使用http://和www。可选的,而是取决于路径的存在:

preg_match_all("'(http://|www[.])*(youtube|vimeo)[.]\w+/[^\s]+'is",