2010-05-22 75 views
3

我有這樣的正則表達式:PHP RegExpr錯誤未知的修飾詞「(」

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?) 

其從論壇中提取主題鏈接

現在,當我使用它在我的劇本

$url = "([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)"; 

preg_match_all spits:「未知修飾符」(''

這也是對preg_match的調用

preg_match_all($url, $str, $matches,PREG_OFFSET_CAPTURE,3); 

誰能幫我解決這個明顯的愚蠢問題

+2

這是一個奇怪的正則表達式。它會匹配「nice.rum.is.nice.1234」,就像匹配該網址一樣容易。你確定你想要使用角色類嗎? – 2010-05-22 15:07:08

回答

3

PCRE要求delimiters將實際正則表達式與optional modifiers分開。使用PHP,您可以使用任何非字母數字,非反斜槓,非空白字符以及成對出現的分隔符(括號)。

在您的情況下,使用前導(作爲分隔符,並且第一個對應的關閉)標記正則表達式的結尾;其餘被視爲修飾符:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?) 
^           ^

但結束符(()後的第一個字符是不是有效的改性劑。那爲什麼錯誤消息說未知修飾符'('

在大多數情況下,/被用作Perl中的分隔符。但是這需要在正則表達式中每次出現/。因此,選擇不在正則表達式中的分隔符是一個不錯的選擇。在你的情況下,你可以使用像BoltClock建議的#

哦,順便說一句:像[http://some.url.com/index.php?showtopic=\"]這樣的字符類只是所列字符的一個單個字符。所以要麼h,t,p,:, /等。如果你的意思是表達http://some.url.com/index.php?showtopic="字面上,只使用http://some\.url\.com/index\.php\?showtopic="(不要忘記逃離元字符)。

+0

感謝球員,但是當我意識到我的表達不正確後,我花了一些時間改變它。 – Anonymous 2010-05-22 16:58:44

6

你需要用分隔符中的正則表達式。任何字符不是一個特殊的元字符PCRE會做,所以我會用#

$url = "#([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)#"; 

您可以瞭解更多關於在定界符the PHP manual section for PCRE delimiters

+0

感謝球員,但這兩個例子都顯示了一個錯誤: 意外的'}',期待'(' 這是在我的字符串匹配,所以這是什麼問題,爲什麼要考慮字符串的內容? – Anonymous 2010-05-22 14:52:43

+0

您可以編輯您的問題以包含包含preg_match_all()調用和分隔正則表達式的代碼嗎? – BoltClock 2010-05-22 14:54:30

相關問題