我得到了以下正则表达式:
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?
答案 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..../两次。