# PHP的正則表達式基礎有哪些
正則表達式(Regular Expression)是處理字符串的強大工具,PHP提供了豐富的正則函數支持。本文將系統介紹PHP中正則表達式的基礎知識,包括語法規則、常用函數及實際應用場景。
## 一、正則表達式簡介
### 1.1 什么是正則表達式
正則表達式(簡稱regex)是用于描述字符串匹配規則的特定語法,通過特殊字符和普通字符的組合構成匹配模式。
```php
// 示例:簡單郵箱驗證
$email = "test@example.com";
if (preg_match('/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email)) {
echo "Valid email";
}
PHP支持兩種風格的正則: - PCRE(Perl Compatible Regular Expressions) - POSIX擴展(已棄用)
本文主要介紹PCRE風格,函數前綴為preg_
PHP正則必須用定界符包圍,常用/,也可用#或~
$pattern = '/abc/'; // 推薦
$pattern = '#abc#'; // 替代方案
具有特殊含義的字符:
| 元字符 | 說明 |
|---|---|
| . | 匹配除換行外任意字符 |
| ^ | 匹配字符串開始 |
| $ | 匹配字符串結束 |
| | | 或運算符 |
| […] | 字符集合 |
// 匹配a或b開頭的字符串
preg_match('/^[ab].*/', 'apple'); // 匹配成功
| 量詞 | 說明 |
|---|---|
| * | 0次或多次 |
| + | 1次或多次 |
| ? | 0次或1次 |
| {n} | 恰好n次 |
| {n,} | 至少n次 |
| {n,m} | n到m次 |
// 匹配3-5位數字
preg_match('/\d{3,5}/', '1234'); // 匹配成功
| 字符 | 等價于 | 說明 |
|---|---|---|
| \d | [0-9] | 數字字符 |
| \D | [^0-9] | 非數字 |
| \w | [a-zA-Z0-9_] | 單詞字符 |
| \W | [^a-zA-Z0-9_] | 非單詞字符 |
| \s | [\t\n\r\f\v] | 空白字符 |
| \S | [^\t\n\r\f\v] | 非空白字符 |
使用反斜杠\轉義元字符
// 匹配包含.的字符串
preg_match('/\./', 'example.com'); // 匹配成功
| 修飾符 | 說明 |
|---|---|
| i | 不區分大小寫 |
| m | 多行模式 |
| s | 使.匹配包括換行 |
| u | 啟用Unicode支持 |
| x | 忽略模式中的空白和注釋 |
// 不區分大小寫匹配
preg_match('/apple/i', 'Apple'); // 匹配成功
執行匹配,返回是否匹配成功
$str = "Hello World";
if (preg_match('/world/i', $str)) {
echo "Found!";
}
全局匹配,返回所有結果
$str = "cats and dogs";
preg_match_all('/[a-z]+s/', $str, $matches);
print_r($matches[0]); // 輸出: Array([0] => cats [1] => dogs)
搜索替換
$text = "April 15, 2023";
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$2 ${1} $3';
echo preg_replace($pattern, $replacement, $text);
// 輸出: 15 April 2023
用正則分割字符串
$str = "apple,orange,banana";
$arr = preg_split('/,/', $str);
print_r($arr); // 輸出: Array([0] => apple [1] => orange [2] => banana)
數組過濾
$arr = ["apple", "123", "pear"];
$filtered = preg_grep('/^\d+$/', $arr);
print_r($filtered); // 輸出: Array([1] => 123)
使用()創建捕獲組
$str = "2023-04-15";
preg_match('/(\d{4})-(\d{2})-(\d{2})/', $str, $matches);
print_r($matches);
/* 輸出:
Array (
[0] => 2023-04-15
[1] => 2023
[2] => 04
[3] => 15
)
*/
(?:)不捕獲匹配內容
preg_match('/(?:\d{4})-(\d{2})/', '2023-04', $matches);
print_r($matches); // 不捕獲年份部分
(?P<name>)為組命名
preg_match('/(?P<year>\d{4})-(?P<month>\d{2})/', '2023-04', $matches);
echo $matches['year']; // 輸出: 2023
| 斷言 | 說明 |
|---|---|
| \b | 單詞邊界 |
| \B | 非單詞邊界 |
| (?=) | 正向先行斷言 |
| (?!) | 負向先行斷言 |
| (?<=) | 正向后行斷言 |
| (?<!) | 負向后行斷言 |
// 匹配后面不是數字的foo
preg_match('/foo(?!\d)/', 'foo bar', $match); // 匹配成功
function validateEmail($email) {
return preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email);
}
$text = "Visit https://example.com or http://test.org";
preg_match_all('/https?:\/\/[^\s]+/', $text, $urls);
print_r($urls[0]);
$html = '<div>Content</div>';
$stripped = preg_replace('/<[^>]*>/', '', $html);
echo $stripped; // 輸出: Content
function checkPassword($pass) {
// 至少8位,含大小寫和數字
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $pass);
}
*?、+?[a-z]比.更高效^和$可以顯著提高性能preg_quote()處理變量部分$dynamic = 'user_input';
$pattern = '/^' . preg_quote($dynamic, '/') . ':\d+$/';
preg_last_error()獲取錯誤信息if (preg_match($pattern, $str) === false) {
echo "Error: " . preg_last_error_msg();
}
掌握PHP正則表達式能極大提升文本處理能力。建議從簡單模式開始,逐步構建復雜表達式,并善用分組和斷言等高級特性。記住”編寫正則表達式就像寫詩,簡潔而富有表現力”。
本文總計約3600字,涵蓋了PHP正則表達式的基礎知識、核心函數和實用技巧。實際開發中應根據具體需求靈活運用,并注意性能和安全性問題。 “`
注:由于實際字數統計可能因格式變化而略有不同,本文結構完整包含了所有關鍵知識點,可通過擴展示例或增加細節說明來精確控制字數。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。