Php 正则表达式:不包含

Php 正则表达式:不包含,php,regex,Php,Regex,我知道这个问题已经被问过很多次了,但我似乎无法让它起作用 我尝试使用正则表达式来查找任何Facebook URL的匹配项,但当URL包含“plugins/like”(如http://www.facebook.com/plugins/like)) 我得出了以下结论,但我不太清楚它为什么不起作用: https?://(www)?\.facebook\.[a-zA-Z]{2,4}/((?!plugins/like).) 我是否犯了一个非常明显的错误?很抱歉,如果这没有任何意义,但我只是在过去的五个月

我知道这个问题已经被问过很多次了,但我似乎无法让它起作用

我尝试使用正则表达式来查找任何Facebook URL的匹配项,但当URL包含“plugins/like”(如http://www.facebook.com/plugins/like))

我得出了以下结论,但我不太清楚它为什么不起作用:

https?://(www)?\.facebook\.[a-zA-Z]{2,4}/((?!plugins/like).)
我是否犯了一个非常明显的错误?很抱歉,如果这没有任何意义,但我只是在过去的五个月里尝试了一手PHP

非常感谢您的时间和帮助

编辑:
到目前为止,我得到了所有FB URL的匹配项,但它并没有排除任何包含插件的内容/比如

您忘记在模式中使用特殊字符。像:和/这样的字符必须跟在反斜杠后面

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

您的re一切正常(它工作正常;我检查过了)。我唯一想改变的就是写作

(?!.*plugins/like)

而不是
(?!插件/like)。
。这适用于
插件在
facebook.com/
之后不直接运行的情况,这里有一个使用
strpos()的解决方案


/
在正则表达式中不是特殊字符,不需要转义。除非你在PCRE中使用它作为分隔符,但是如果你有更明智的选择,为什么要这样做呢?它是在PHP中,我刚刚测试过它(PHP是问题中的一个标记)。Forwardslashes需要转义?我总是使用#作为分隔符,因为@Joey说,它们只需要在还用作模式分隔符的地方转义。正斜杠不是分隔符的唯一选项(例如,还有
)。请尝试将第一个
\.
移动到
(www)
块中;如果在它之后,它将匹配
http://.facebook.com
-如果您使用
http://facebook.com
它会失败。你看过facebook.co.uk了吗?试试
!https?\:/(www\)?facebook\[a-z]{2,4}/((?!plugins/like)。*)!我
@Pete我刚做了。我很惊讶没有TLD。@DaveRandom随着网络抢占的发展,这不是一个很好的工作,是吗?我想这可能是最后一个抓捕小组搞砸了它,但既然它在那里,我想OP想要抓捕路径部分。“虽然”将对该部分进行排序,如有必要,可以修剪前导斜杠。@AKG“原始海报”或该主题的变体。我见过一些其他的解释,但它们基本上都是这样的。桔皮是我唯一能想到的:)
(?!.*plugins/like)
$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
}