2014-03-31 56 views
0

我想查看當前請求是否在本地主機上。這樣做,我用下面的正則表達式:我的正則表達式不適用於簡單的單詞匹配

return (preg_match("/(^localhost).*/", $url) == true || 
      preg_match("/^({http|ftp|https}://localhost).*/", $url) == true) 
      ? true : false; 

這裏是$urlvar_dump()

string 'http://localhost/aone/public/' (length=29) 

這使返回false雖然。這個正則表達式的問題是什麼?

+0

'$ url'包含什麼?發佈var_dump($ url)的輸出;' –

+0

查看更新後的問題 –

+1

刪除正則表達式中的'{'和'}'。並使用'(...)'代替。此外,您可以使用一個正則表達式:'〜^(?:(?:(?:https?| ftp)://)?localhost)。*〜' – Jerry

回答

2

你是目前使用正斜槓(/)作爲分隔符,但您不會在模式字符串中轉義它。這將導致錯誤,並會導致您的preg_match()語句不起作用(如果您沒有啓用錯誤報告)。

此外,您正在使用不正確的交替。如果你想匹配foobar,你會寫(foo|bar)而不是{foo|bar}

更新preg_match()應該是這樣的:

preg_match("/^(http|ftp|https):\/\/localhost.*/", $url) 

或用不同的分隔符(這樣你就不必逃避所有的/字符):

preg_match("#^(http|ftp|https)://localhost.*#", $url) 
+0

這就是答案 –

+1

不,這不是答案。它匹配'http。*',OR'ftp。*'OR':\/\/localhost。*' – Jerry

+0

我懷疑它是否正常工作。只有'http | ftp | https'需要分組。 – JorgeeFG

1

{http|ftp|https} 

是錯誤的。

我想你的意思是

(http|ftp|https) 

另外,如果你只想要組,也無法捕捉的,請加?:

(?:http|ftp|https) 
+0

是的,這是我的問題。非常感謝 –

2

大括號具有特殊含義的正則表達式,它們用於量化前面的字符。

所以:

/^({http|ftp|https}://localhost).*/ 

也許應該是這樣的:

#^((http|ftp|https)://localhost).*# 

編輯:改變了分隔符,這樣的正斜槓並不需要進行轉義

+0

你需要逃避//但總體來說不錯。 – JorgeeFG

+0

@喬治好點,錯過了。 – jeroen

+0

是否需要用括號將localhost分組? – JorgeeFG

1

我會改變當前的代碼爲:

return preg_match("~^(?:(?:https?|ftp)://)?localhost~", $url); 

您正在使用{}用於分組,當這些用於量化並且以其他方式表示文字{和`}字符時。

幾件事情要補充的是,:

  • 可以使用https?代替(http|https);
  • 當您的模式將這些符號作爲分隔符時,您可以使用正則表達式的其他分隔符。這可以避免你過度逃脫;
  • 你可以合併這兩個正則表達式,因爲一個部分是可選的((?:https?|ftp)://部分),這樣做會使後面的比較器不必要;
  • .*最後不是必需的。
相關問題