PHP - 正則表達式:初學者指南

你好,未來的PHP巫師們!今天,我們將深入PHP中正則表達式的迷人世界。別擔心如果你從未編過程序——我將成為你這次刺激旅程中的友好指導。我們開始吧!

PHP - Regular Expression

正則表達式是什麼?

在我們跳進PHP專有的內容之前,讓我們先了解正則表達式(regex)是什麼。想像你是一名偵探,試圖在海量的文字中尋找一個特定的模式。這正是regex所做的——它幫助你根據模式搜索、匹配和操縱文本。酷炫吧?

POSIX正則表達式

POSIX(可移植操作系統介面)正則表達式是PHP中regex的原始標準。雖然現在它們不常見,但理解它們可以為你提供堅實的基礎。

基礎POSIX Regex範例

讓我們從一個簡單的範例開始:

$text = "The quick brown fox jumps over the lazy dog.";
$pattern = "/quick/";
if (ereg($pattern, $text)) {
echo "找到匹配!";
} else {
echo "沒有找到匹配。";
}

在這個範例中,我們正在句子中尋找單詞"quick"。ereg()函數檢查模式是否在任何地方匹配文本。

PHP的Regexp POSIX函數

PHP提供了多個POSIX regex函數。以下是最常見的一些:

函數 描述
ereg() 正則表達式匹配
eregi() 不区分大小寫的正則表達式匹配
ereg_replace() 替换正則表達式
split() 使用正則表達式拆分字符串

範例:使用eregi()進行不區分大小寫的匹配

$text = "The Quick Brown Fox";
$pattern = "quick";
if (eregi($pattern, $text)) {
echo "找到匹配!";
} else {
echo "沒有找到匹配。";
}

這次,即使我們的文本中"Quick"是大寫的,我們也能找到匹配。

PERL風格正則表達式

現在,讓我們來討論更現代且強大的PERL兼容正則表達式(PCRE)。這是你們在PHP專案中最可能使用的。

基礎PCRE範例

$text = "The quick brown fox jumps over the lazy dog.";
$pattern = "/quick/";
if (preg_match($pattern, $text)) {
echo "找到匹配!";
} else {
echo "沒有找到匹配。";
}

這看起來與我們的POSIX範例相似,但我們使用的是preg_match()而不是ereg()

PHP的Regexp PERL兼容函數

PCRE函數在PHP中更多功能且效率更高。以下是一些常見的PCRE函數:

函數 描述
preg_match() 执行正則表達式匹配
preg_match_all() 执行全局正則表達式匹配
preg_replace() 执行正則表達式搜索和替換
preg_split() 使用正則表達式拆分字符串

範例:使用preg_match_all()查找所有匹配

$text = "The quick brown fox jumps over the quick lazy dog.";
$pattern = "/quick/";
if (preg_match_all($pattern, $text, $matches)) {
echo "找到 " . count($matches[0]) . " 個匹配!";
print_r($matches);
} else {
echo "沒有找到匹配。";
}

這個腚本將在我們的文本中找到所有"quick"的出現,並將它們存儲在$matches數組中。

高級PCRE技術

現在,我們已經介紹了基礎知識,讓我們來看看一些更高级的技术。

元字符

元字符是正則表達式中具有特定含義的特殊字符。以下是一些常見的:

  • . : 匹配除換行符之外的任何單個字符
  • ^ : 匹配字符串的開頭
  • $ : 匹配字符串的結尾
  • * : 匹配零個或多個出現
  • + : 匹配一個或多個出現
  • ? : 匹配零個或一個出現

範例:使用元字符

$text = "The quick brown fox jumps over the lazy dog.";
$pattern = "/^The/";
if (preg_match($pattern, $text)) {
echo "文本以 'The' 開頭";
} else {
echo "文本不以 'The' 開頭";
}

這個腚本檢查我們的文本是否以"The"開頭。

字符類

字符類允許你匹配一組字符中的任何一個。它們被括在方括號[]內。

範例:使用字符類

$text = "The quick brown fox jumps over the lazy dog.";
$pattern = "/[aeiou]/i";
if (preg_match_all($pattern, $text, $matches)) {
echo "找到 " . count($matches[0]) . " 個元音!";
print_r($matches);
} else {
echo "沒有找到元音。";
}

這個腚本找到我們文本中的所有元音。模式末尾的i使其不區分大小寫。

實際應用

現在我們已經介紹了基礎知識和一些高级技术,讓我們來看一個實際應用的例子。

驗證電子郵件地址

$email = "[email protected]";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo "有效的電子郵件地址!";
} else {
echo "無效的電子郵件地址!";
}

這個腚本使用一個复雜的正則表達式來驗證電子郵件地址。它檢查:

  • @之前有一個或多個字母、數字、點、下劃線、百分號、加號或連字符
  • @之後有一個或多個字母、數字、點或連字符
  • 在最後有一個點後跟兩個或多個字母

結論

恭喜你!你已經邁出了進入PHP正則表達式世界的第一步。記住,regex是一個强大的工具,但也可能相当复杂。關鍵在於練習——你使用得越多,就越會感到熟悉。

在你繼續你的PHP旅程時,你會發現regex在表單驗證、數據解析和文本操縱等任务中非常有用。繼續探索,繼續編程,最重要的是,玩得開心!

Credits: Image by storyset