2011-02-11 47 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",