根據經驗法則,最好使用單引號字串來描述您的正規表達式模式。
使用雙引號字串時,PHP 和 PCRE 對字串中哪些部分是跳脫序列的解釋之間的交互作用可能會變得混亂。正規表達式本身就夠複雜了,再來一層跳脫只會讓情況更糟。
根據經驗法則,最好使用單引號字串來描述您的正規表達式模式。
使用雙引號字串時,PHP 和 PCRE 對字串中哪些部分是跳脫序列的解釋之間的交互作用可能會變得混亂。正規表達式本身就夠複雜了,再來一層跳脫只會讓情況更糟。
如果有人看到這個錯誤
警告:preg_match() [function.preg-match]:編譯失敗:PCRE 不支援 \L、\l、\N、\P、\p、\U、\u 或 \X 於 ...
如同本手冊頁面所述,您需要 PHP 5.1.0 和 /u 修飾符才能啟用這些功能,但這並非唯一的要求!可以安裝較新版本的 PHP(我們使用的是 5.1.4),同時連結到較舊的 PCRE 安裝。快速瀏覽 PCRE 更新日誌表明您可能至少需要 PCRE 5;我們正在運行 4.5,而最新版本是 7.1。您可以透過檢查 phpinfo() 來找出您的 PCRE 版本。
我懷疑這個古老的 PCRE 版本包含在某些官方支援的 Red Hat Enterprise 套件中,這可能就是我們運行它的原因,但也可能會影響其他人。
在上面的字元類別中繼字元文件中,插入符號 (^) 的描述如下
「^ 否定該類別,但僅限於第一個字元」
應該更詳細地說明 ^ 的含義
^ 否定字元類別。如果使用,則必須是類別的第一個字元(例如「[^012]」)。
關於下面兩篇文章中的 strip_selected_tags 函式
如果有人使用沒有結尾字元「>」的標籤,例如
<p <b> 粗體文字 </b</p
這甚至是有效的 HTML(但不是有效的 XHTML)
如果您像我一樣傾向於使用 /U 模式修飾符,那麼您需要記住,使用 ? 或 * 來測試可選字元將會匹配零個字元,如果這意味著模式的其餘部分可以繼續匹配,即使可選字元存在。
例如,如果我們有這個字串
a___bcde
並應用這個模式
'/a(_*).*e/U'
整個模式都匹配,但沒有任何 _ 字元被放置在子模式中。解決此問題的方法(如果您仍然希望使用 /U)是使用 ? 貪婪反轉器。例如:
'/a(_*?).*e/U'
我到現在才開始使用正規表達式,並且在嘗試將 [url]連結放在這裡[/url] 轉換為 href 以用於在論壇上發佈訊息時遇到了很多困難,以下是我想出的方法
$patterns = array(
"/\[link\](.*?)\[\/link\]/",
"/\[url\](.*?)\[\/url\]/",
"/\[img\](.*?)\[\/img\]/",
"/\[b\](.*?)\[\/b\]/",
"/\[u\](.*?)\[\/u\]/",
"/\[i\](.*?)\[\/i\]/"
);
$replacements = array(
"<a href=\"\\1\">\\1</a>",
"<a href=\"\\1\">\\1</a>",
"<a href=\"\\1\">\\1</a>",
"<img src=\"\\1\">",
"<b>\\1</b>",
"<u>\\1</u>",
);
"<i>\\1</i>"
一開始它會把所有標籤都收集到一個連結/粗體/等等,直到我加了「?」 我仍然不完全理解它... 但它有效 :)
關於「與 Perl 的差異」中的註釋 #6,\G 標記 *有* 被支援作為最後匹配位置錨點。這已經確認至少在 preg_replace() 中有效,雖然我假設它在 preg_match_all() 和其他可以進行多個匹配的函式中也能正常運作。