2012-03-16 127 views
1

嗨stackoverflow社区!
我想在PHP中使用一个简单的正则表达式表达式,基于正面后视。我的目标是提取域名和一组特定字符(?或&或/)之间的URL中的所有内容。我想提取 “栏” 上的那些例子:PHP的正则表达式:几个停止字符积极lookbehind

  • foo.com/bar?
  • foo.com/bar&
  • foo.com/bar/

我试图

(?<=foo\.com\/)[^/?&]+ 

它工作正常the plateform test 但与PHP 5.3x preg_match:错误thr自己的是,我不能使用几个停止字符 - 它适用于一个。

我也尝试了积极lookbehind/lookahead的组合,但问题仍然相同。 我做错了什么?

+0

你封闭正则表达式里面的分隔符?你能告诉我们你的代码吗? – Toto 2012-03-16 12:24:49

+0

@ M42肯定!这里是:'preg_match(“/(?<= foo \ .com \ /)[^ /?&] + /”,“http://www.foo.com/bar?”,$ result);' – 2012-03-16 12:33:37

+0

您需要转义所有斜线:'/(?<= foo \ .com \ /)[^ \ /?&] + /'包括字符类中的一个。 – Toto 2012-03-16 12:35:18

回答

1

在PHP中,不像(比如说)JavaScript,不能在不转义它的情况下使用正则表达式分隔符,即使在字符类内部也不能使用正则表达式分隔符。所以,你需要改变这一点:

"/(?<=foo\.com\/)[^/?&]+/" 

这样:

"/(?<=foo\.com\/)[^\/?&]+/" 
1

逃生斜线:

preg_match("/(?<=foo\.com\/)[^\/?&]+/", "http://www.foo.com/bar?", $result); 
         here ___^ 

或使用其他分隔符

preg_match("#(?<=foo\.com/)[^/?&]+#", "http://www.foo.com/bar?", $result);