2012-03-16 118 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);