2011-10-05 87 views
45

我有這樣的代碼:分隔符不能是字母,數字或反斜線和的preg_match

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches); 
echo $matches[1]; 

和IM運行,當它返回此錯誤:

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+0

作爲一個說明可能會有所幫助別人,如果你是通過你所有的參數'的preg_match()'作爲變量,確保你不會在無意中混入了變量的順序函數調用,因爲這幾乎肯定會導致出現相同的錯誤。 – bluebinary

回答

86

您需要爲您的圖案的分隔符。它應該在模式的開始和結尾處添加像這樣:

$pattern = "/My name is '(.*)' and im fine/"; // With/as a delimeter 
+1

這應該是正確的答案。 –

1

請與本

$pattern = "/My name is '\(.*\)' and im fine/"; 
+0

爲何不使用括號? –

18

嘗試你必須指定表達式的分隔符。分隔符是在表達式開始和結束時使用的特殊字符,用於表示表達式的哪個部分。這允許您使用修飾符和解釋器來知道哪個是表達式,哪些是修飾符。如錯誤消息所述,分隔符不能是反斜槓,因爲反斜槓是轉義字符。

$pattern = "/My name is '(.*)' and im fine/"; 

和相同的例子,但以下用i改性劑以匹配而不區分大小寫。

$pattern = "/My name is '(.*)' and im fine/i"; 

正如你所看到的,i是斜線之外,因此被解釋爲修飾。另外請記住,如果使用正斜槓字符(/)作爲分隔符,則必須在正則表達式中進一步使用/,如果存在的話。

29

解決方案(其他答案至少在我最初寫這篇文章的時候沒有提到—)是當PHP引用分隔符時,它不是指您在代碼中看到的分隔符(它們是引號)但字符串中的下一個字符。 (事實上​​,我從來沒有見過這說明任何地方的任何文檔中。你必須看到它的例子),所以,而不必像什麼,你可以從許多其他語言習慣了一個正則表達式語法:

/something/ 

PHP使用字符串,然後查找裏面的字符串爲另一個分隔符:

'/something/' 

定界符PHP指的是一對/字符,而不是對'字符。因此,如果您編寫'something',PHP將採用s作爲預期的分隔符,並且抱怨您不允許使用字母數字字符作爲分隔符。

所以,如果你想通過(例如)的i表明你希望的情況下,鈍感的比賽,你通過它裏面的字符串,但外面的正則表達式的分隔符:

'/something/i' 

如果你想使用比/其他東西作爲您的分隔符,就可以了,比如,如果你匹配一個URL,不希望有逃避所有的斜線:

'~something~' 
+1

不能滿足這個足夠的時間! – Gruber

+0

@Gruber:謝謝!您可以隨時將所有朋友鏈接發送給它,讓他們支持它;) – iconoclast

+0

解釋什麼文檔無法解釋.. +1謝謝! –

5

模式必須有分隔符。分隔符可以是正斜槓(/)或任何非字母數字字符(#,$,*,...)。例如

$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
相關問題