星期一, 九月 22, 2008

PHP 為 Regex 加跳脫字元 的 function: quotemeta

使用 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 倍.

 

相關標籤
Add this page to del.icio.us Add this page to Yahoo Taiwan's bookmark Add this page to MyShare

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~