使用 Regular expression 時, 有以下這些特殊用途的符號:
. \ + * ? [ ^ ] ( $ )
若要處理某些輸入, 直接丟給 preg_match / preg_replace.. 等 使用, 就會有出乎意料外的結果.
要避免此意外, 丟進去前, 要先將那字串做處理, quotemeta 會 對特殊用途的符號加上 跳脫字元(backslash)"\".
例如:
<?php
$str = 'ooxx...book+pen...123';
$ex = 'book+pen';
print_r(preg_replace("/$ex/", '', $str)); // ooxx...book+pen...123$ex = quotemeta('book+pen');
print_r(preg_replace("/$ex/", '', $str)); // ooxx......123
?>
使用上述做法的主要用途在於 $ex 的變數, 是隨時做改變的. (function 的變數或是外來的變數等)
若是 固定字串, 有簡單又快速的方式處理:
<?php
$str = 'ooxx...book+pen...123';
print_r(preg_replace("/\Qbook+pen\E/", '', $str)); // ooxx......123
print_r(str_replace("book+pen", '', $str)); // ooxx......123
?>
附註:
- Regex 中: \Q\E 包住的字串, 會將此字串直接做取代,不會理會裡面的特殊符號.
- str_replace() 用來取代固定字串, 速度會比 preg_replace 快上 N 倍.