preg_match_all - справка по выражению регулярного выражения - PullRequest
0 голосов
/ 11 февраля 2011

Мне было дано следующее регулярное выражение:

 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. ... / очень мило, хм? "

Вместо того, чтобы получать только URL, я также получаю слово vimeo.

Я считаю, что выражение regex повторяет больше, чем должно, и я хотел бы получить ТОЛЬКО те URL-адреса, которые он находит, а не все ссылки на «vimeo» или «youtube».

Могу ли я запросить вашу помощь, чтобы сузить область действия этого выражения и получить только URL-адреса?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Первый знак вопроса ? в регулярных выражениях не требуется.Это делает предыдущие строки поиска необязательными, и, таким образом, также соответствует голому слову vimeo в текстах.Попробуйте:

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

Подсказка: добавьте (?<![,.)]) в конце, если вы хотите исключить типичную взаимосвязь, которая часто приводит к ошибкам при поиске по URL.


В качестве альтернативы с http:// и www.необязательно, но в зависимости от наличия пути:

preg_match_all("'(http://|www[.])*(youtube|vimeo)[.]\w+/[^\s]+'is",
1 голос
/ 11 февраля 2011

Может быть, немного поможет следующий код:

<?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. ... / дважды.

...