2012-07-30 168 views
2

我知道这个问题已经被问了很多次,但我似乎无法得到这个工作。正则表达式:不包含

我试图用正则表达式找到任何Facebook的网址,的比赛,但没有 URL包含“插件/像”(如“http://www.facebook.com/plugins/like “)

我拿出下面,我不明白为什么它不工作:

https?://(www)?\.facebook\.[a-zA-Z]{2,4}/((?!plugins/like).) 

我是不是做一个很明显的错误?对不起,如果它没有任何意义,但我只在过去五个月尝试在PHP的手。

非常感谢您的时间和您的帮助。

编辑: 我得到匹配任何FB URL到目前为止,但不排除任何含有插件/像

+2

尝试移动第一个'\ .'到'(WWW)'块的解决方案?;如果它在后面,它将匹配'http://。facebook.com' - 如果您正在使用http:// facebook.com的示例网址进行测试,则会失败。 – newfurniturey 2012-07-30 12:52:58

+1

你看过facebook.co.uk Dave吗? – Pete 2012-07-30 12:53:01

+0

尝试'!https?\://(www \。)?facebook \。[a-z] {2,4} /((?!plugins/like)。*)!i' – 2012-07-30 12:53:32

回答

2
$urls = array(
    'http://www.facebook.com/', 
    'https://facebook.com/plugins/foo', 
    'http://facebook.ru/plugins/like', 
); 

$pattern = '#^https?://(www\.)?facebook\.[a-z]{2,4}/(?!plugins/like)#'; 

foreach ($urls as $url) { 
    echo preg_match($pattern, $url) . PHP_EOL; 
} 

好吗?

+0

我认为这可能是最后一个捕获组与它搞砸了,但因为它在那里我想象OP想要捕获路径部分。尽管[this](http://viper-7.com/eJRrjf)会对该部分进行排序,并且必要时可以修剪前导斜杠。 – DaveRandom 2012-07-30 13:04:37

+0

稍有偏离主题,但我一直想知道OP代表什么... – AKG 2012-07-30 13:05:35

+0

原创海报 – Pete 2012-07-30 13:06:22

0

你忘了在图案esacpe特殊字符。字符如:和/必须跟在反斜杠之后。

https?\:\/\/(www)?\.facebook\.[a-zA-Z]{2,4}\/((?!plugins\/like).) 
+0

'//'在正则表达式中不是特殊字符,不需要转义。除非您在PCRE中将它用作分隔符,但如果您有更明智的选择,为什么要这么做呢? – Joey 2012-07-30 12:52:42

+0

这是在PHP中,我只是测试它(PHP是问题中的标签之一)。 – Summoner 2012-07-30 12:53:13

+0

Forwardslashes需要转义? – AKG 2012-07-30 12:53:59

0

一切都很好,你的重新(它的工作原理;我检查)。我会改变的唯一的事情是写

(?!.*plugins/like) 

而不是(?!plugins/like).。那是pluginsfacebook.com/之后不直接的情况。

1

这里是使用strpos()

$url = 'http://www.facebook.com/test/plugins/like?somestuff'; 

$matches = array(); 

if(preg_match('#^https?://(?:www)?\.facebook\.[a-zA-Z]{2,4}/(.*)$#', $url, $matches) 
    && strpos($matches[1], "plugins/like") === false) { 
    // ok 
} else { 
    // nope 
}