正則表達式(Regex)是一種用於模式匹配與替換的強大工具。廣泛應用於 Perl、PHP、JavaScript、Java、Python、sed、awk、vi 等語言與工具,已成為跨平台通用技能。
典型應用:表單驗證(Email、手機號)、資料清洗、日誌分析、關鍵字提取、URL 重寫等。
PHP 使用 /pattern/ 或 #pattern# 等成對字元包裹模式。
| 符號 | 含義 |
|---|---|
. | 匹配除換行外任意單一字元 |
\d | 數字 [0-9] |
\D | 非數字 |
\w | 字母、數字、底線 [a-zA-Z0-9_] |
\W | 非單字字元 |
\s | 空白字元(空格、Tab、換行) |
\S | 非空白字元 |
| 符號 | 含義 | 等價 |
|---|---|---|
* | 0 次或多次 | {0,} |
+ | 1 次或多次 | {1,} |
? | 0 次或 1 次 | {0,1} |
{n} | 恰好 n 次 | — |
{n,} | 至少 n 次 | — |
{n,m} | n 到 m 次 | — |
| 符號 | 含義 |
|---|---|
^ | 字串開頭(多行模式下為行首) |
$ | 字串結尾(多行模式下為行尾) |
\b | 單字邊界 |
\B | 非單字邊界 |
[abc] — a 或 b 或 c[a-z] — a 到 z 範圍[^abc] — 非 a/b/c(^ 在 [] 內為否定)(abc) — 分組捕獲,可後向參考 \1(?:abc) — 非捕獲分組a|b — 或(a 或 b)i — 忽略大小寫m — 多行模式(^$ 匹配行首尾)s — 單行模式(. 匹配換行)x — 忽略模式空白、允許註解u — UTF-8 模式<?php
$email = 'user@example.com';
$pattern = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i';
if (preg_match($pattern, $email)) {
echo "格式正確";
} else {
echo "格式錯誤";
}
// 進階:檢查 MX 記錄
if (preg_match($pattern, $email)) {
list(, $domain) = explode('@', $email);
if (checkdnsrr($domain, 'MX')) echo " 域名可收信";
}
?>
$path = '/var/www/html/images/photo.jpg';
preg_match('/([^\/]+)$/', $path, $matches);
echo $matches[1]; // photo.jpg
$str = "a b\tc\nd";
echo preg_replace('/\s+/', ',', $str); // a,b,c,d
function makeClickableLinks($text) {
$text = preg_replace('/\b((?:https?|ftp):\/\/[^\s]+)/i', '<a href="$1">$1</a>', $text);
$text = preg_replace('/\b(www\.[^\s]+)/i', '<a href="https://$1">$1</a>', $text);
$text = preg_replace('/([\w\.-]+@[\w\.-]+\.\w+)/', '<a href="mailto:$1">$1</a>', $text);
return $text;
}
(a+)+),適度使用具體字元類別替代 .,長字串考慮 preg_match_all 分批處理。/^[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+@[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+$/
若能拆解其結構,表示已具備獨立撰寫複雜正則的能力。