preg_match_all - 正则表达式帮助

时间:2011-02-11 17:51:20

标签: php regex 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..../非常好的嗯?“

我没有收到网址,而是接​​受了vimeo这个词。

我相信正则表达式正在倒退,它应该更多,我想只检索它找到的网址,而不是每个“vimeo”或“youtube”的引用。

我是否可以请求您的帮助以缩小此表达式的范围,以便仅检索URL?

2 个答案:

答案 0 :(得分:2)

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

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

提示:如果您想要排除通常会搞砸此类网址搜索的典型内部功能,请在末尾添加(?<![,.)])


另外,使用http://和www。可选,但取决于路径的存在:

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

答案 1 :(得分: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..../两次。