資料採集、表單驗證或文字分析時,常需移除中英文標點符號。本文提供一個健全的 filter_mark() 函式,支援全形/半形標點、特殊符號與空白字元的過濾。
<?php
function filter_mark($text) {
if (trim($text) === '') return '';
// 1. 移除所有標點與空白 (POSIX [:punct:] + \s)
$text = preg_replace("/[[:punct:]\s]/", ' ', $text);
// 2. URL 編碼以統一處理多位元組字元
$text = urlencode($text);
// 3. 針對常見中英文標點的 URL 編碼進行二次過濾
$text = preg_replace(
"/(%7E|%60|%21|%40|%23|%24|%25|%5E|%26|%27|%2A|%28|%29|%2B|%7C|%5C|%3D|\-|_|%5B|%5D|%7D|%7B|%3B|%22|%3A|%3F|%3E|%3C|%2C|\.|%2F|%A3%BF|%A1%B7|%A1%B6|%A1%A2|%A1%A3|%A3%AC|%7D|%A1%B0|%A3%BA|%A3%BB|%A1%AE|%A1%AF|%A1%B1|%A3%FC|%A3%BD|%A1%AA|%A3%A9|%A3%A8|%A1%AD|%A3%A4|%A1%A4|%A3%A1|%E3%80%82|%EF%BC%81|%EF%BC%8C|%EF%BC%9B|%EF%BC%9F|%EF%BC%9A|%E3%80%81|%E2%80%A6%E2%80%A6|%E2%80%9D|%E2%80%9C|%E2%80%98|%E2%80%99|%EF%BD%9E|%EF%BC%8E|%EF%BC%88)+/",
' ',
$text
);
// 4. 解碼並修剪
$text = urldecode($text);
return trim($text);
}
?>
<?php
$keyword = "好‘。,好學習PHP!!!";
$keyword = urlencode($keyword);
$keyword = preg_replace(
"/(%7E|%60|%21|%40|%23|%24|%25|%5E|%26|%27|%2A|%28|%29|%2B|%7C|%5C|%3D|\-|_|%5B|%5D|%7D|%7B|%3B|%22|%3A|%3F|%3E|%3C|%2C|\.|%2F|%A3%BF|%A1%B7|%A1%B6|%A1%A2|%A1%A3|%A3%AC|%7D|%A1%B0|%A3%BA|%A3%BB|%A1%AE|%A1%AF|%A1%B1|%A3%FC|%A3%BD|%A1%AA|%A3%A9|%A3%A8|%A1%AD|%A3%A4|%A1%A4|%A3%A1|%E3%80%82|%EF%BC%81|%EF%BC%8C|%EF%BC%9B|%EF%BC%9F|%EF%BC%9A|%E3%80%81|%E2%80%A6%E2%80%A6|%E2%80%9D|%E2%80%9C|%E2%80%98|%E2%80%99)+/",
'',
$keyword
);
$keyword = urldecode($keyword);
echo $keyword; // 輸出:好好學習PHP
?>
urlencode 將多位元組字元轉為單位元組序列,便於正則精確比對。