PHP 菜鳥教程

PHP 高級教程

PHP & MySQL

PHP 參考手冊

PHP 正則表達(dá)式

在本教程中,您將學(xué)習(xí)正則表達(dá)式的工作方式,以及如何使用它們在PHP中以高效的方式執(zhí)行模式匹配。

什么是正則表達(dá)式

正則表達(dá)式通常稱為“ regex ”或“ RegExp ”,是一種特殊格式的文本字符串,用于查找文本中的模式。正則表達(dá)式是當(dāng)今可用的功能最強大的工具之一,可以有效地處理和操縱文本。例如,它可以用于驗證用戶輸入的數(shù)據(jù)格式(例如,姓名,電子郵件,電話號碼等)是否正確,在文本內(nèi)容中查找或替換匹配的字符串,等等。

PHP(版本5.3及更高版本)通過其preg_函數(shù)系列支持Perl樣式正則表達(dá)式。為什么使用Perl風(fēng)格的正則表達(dá)式?因為Perl(實用提取和報告語言)是第一種為正則表達(dá)式提供集成支持的主流編程語言,并且以對正則表達(dá)式的強大支持以及非凡的文本處理和操縱功能而聞名。

在深入探討正則表達(dá)式世界之前,讓我們首先簡要介紹一下常用的PHP內(nèi)置模式匹配功能。

函數(shù)描述
preg_match()執(zhí)行正則表達(dá)式匹配。
preg_match_all()執(zhí)行全局正則表達(dá)式匹配。
preg_replace()執(zhí)行正則表達(dá)式搜索并替換。
preg_grep()返回與模式匹配的輸入數(shù)組的元素。
preg_split()使用正則表達(dá)式將字符串拆分為子字符串。
preg_quote()引用在字符串中找到的正則表達(dá)式字符。

注意: PHP preg_match()函數(shù)在找到第一個匹配項后將停止搜索,而preg_match_all()函數(shù)將繼續(xù)搜索直到字符串的末尾并找到所有可能的匹配項,而不是在第一個匹配項處停止。

正則表達(dá)式語法

正則表達(dá)式語法包括特殊字符的使用(請勿與HTML特殊字符混淆)。在正則表達(dá)式中具有特殊含義的字符是:. * ? + [ ] ( ) { } ^ $ | \。每當(dāng)您想按字面意義使用它們時,都需要反斜杠。例如,如果要匹配“.”,則必須編寫\.。所有其他字符將自動采用其字面含義。

以下各節(jié)描述了可用于制定模式的各種選項:

字符類

字符模式周圍的方括號稱為字符類,例如[ABC]。 字符類始終匹配指定字符列表中的單個字符,這意味著表達(dá)式[abc]只匹配a、b或c字符。

也可以定義否定的字符類,以匹配除括號中包含的字符以外的任何字符。否定的字符類是通過將尖號(^)符號緊接在左括號之后來定義的,例如[^abc]。

您還可以通過在字符類(例如-)中使用連字符()來定義字符范圍[0-9]。讓我們看一些字符類的實例:

正則表達(dá)式它能做什么
[abc]匹配字符a,b或c中的任何一個。
[^abc]匹配a,b,c以外的任何一個字符。
[a-z]匹配從小寫字母a到小寫字母z的任意一個字符。
[A-Z]匹配從大寫字母A到大寫字母Z的任意一個字符。
[a-Z]匹配從小寫字母a到大寫字母Z的任意一個字符。
[0-9]匹配0到9之間的一個數(shù)字。
[a-z0-9]匹配a與z之間 或 0與9之間的單個字符。

以下示例將向您展示如何使用正則表達(dá)式和PHP preg_match()函數(shù)查找字符串中是否存在模式:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){
    echo "Match found!";
} else{
    echo "Match not found.";
}
?>
測試看看?/?

同樣,您可以使用preg_match_all()函數(shù)查找字符串中的所有匹配項:

<?php
$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
測試看看?/?

提示:正則表達(dá)式不是PHP專有的。Java,Perl,Python等語言使用相同的符號來查找文本模式。

預(yù)定義字符類

一些字符類(例如數(shù)字,字母和空格)被頻繁使用,以至于它們都有快捷方式名稱。下表列出了那些預(yù)定義的字符類:

捷徑它能做什么
.匹配除換行符\n之外的任何單個字符。
\d匹配任何數(shù)字字符。 與[0-9]相同。
\D匹配任何非數(shù)字字符。 與[^0-9]相同
\s匹配任何空白字符(空格,制表符,換行符或回車符)。 與[\t\n\r]相同。
\S匹配任何非空格字符。 與[^\t\n\r]相同
\w匹配任何單詞字符(定義為a到z,A到Z,0到9和下劃線)。 與[a-zA-Z_0-9]相同
\W匹配任何非單詞字符。 與[^a-Za-Z_0-9]相同

以下示例將向您展示如何使用正則表達(dá)式和PHP preg_replace()函數(shù)在字符串中使用連字符來查找和替換空格:

<?php
$pattern = "/\s/";
$replacement = "-";
$text = "Earth revolves around\nthe\tSun";
//替換空格,換行符和制表符
echo preg_replace($pattern, $replacement, $text);
echo "<br>";
//僅替換空格
echo str_replace(" ", "-", $text);
?>
測試看看?/?

重復(fù)量詞

在上一節(jié)中,我們學(xué)習(xí)了如何以多種方式匹配單個字符。但是,如果您想匹配多個字符怎么辦?例如,假設(shè)您要查找包含字母p的一個或多個實例的單詞,或包含至少兩個p的單詞,依此類推。這是量詞起作用的地方。使用量詞,您可以指定正則表達(dá)式中的字符應(yīng)匹配的次數(shù)。

下表列出了量化特定模式的各種方法:

正則表達(dá)式它能做什么
p+匹配一個或多個字母p。
p*匹配零個或多個出現(xiàn)的字母p。
p?匹配零個或一個出現(xiàn)的字母p。
p{2}正好匹配兩個字母p。
p{2,3}匹配至少兩個出現(xiàn)的字母p,但不超過三個出現(xiàn)的字母p。
p{2,}

匹配兩次或超過2次出現(xiàn)的字母p。

p{,3}最多匹配三個出現(xiàn)的字母p

以下示例中的正則表達(dá)式將使用PHP preg_split()函數(shù)將字符串分割為逗號,逗號序列,空格或它們的組合:

<?php
$pattern = "/[\s,]+/";
$text = "My favourite colors are red, green and blue";
$parts = preg_split($pattern, $text);
 
//循環(huán)遍歷$parts數(shù)組并顯示子字符串
foreach($parts as $part){
    echo $part . "<br>";
}
?>
測試看看?/?

位置錨

在某些情況下,您希望在行、詞或字符串的開頭或結(jié)尾進(jìn)行匹配。 要做到這一點,您可以使用錨點。 兩個常見的錨點是表示字符串開始的插入符號(^)和表示字符串結(jié)束的美元符號($)。

正則表達(dá)式它能做什么
^p與行首的字母p匹配。
p$與行尾的字母p匹配。

在以下示例中,正則表達(dá)式將僅使用PHP preg_grep()函數(shù)顯示名稱數(shù)組中以字母“ J”開頭的名稱:

<?php
$pattern = "/^J/";
$names = array("Jhon Carter", "Clark Kent", "John Rambo");
$matches = preg_grep($pattern, $names);
 
//遍歷$matches數(shù)組并顯示匹配的名稱
foreach($matches as $match){
    echo $match . "<br>";
}
?>
測試看看?/?

模式修飾符

模式修飾符允許您指定模式匹配的處理方式。模式修飾符直接放置在正則表達(dá)式之后,例如,如果要以不區(qū)分大小寫的方式搜索模式,則可以使用 i 修飾符,如下所示:/pattern/i。下表列出了一些最常用的模式修飾符。

修飾符它能做什么
i使匹配不區(qū)分大小寫。
m更改^和$的行為以匹配換行符邊界(即多行字符串中每行的開始或結(jié)束),而不是字符串邊界。
g執(zhí)行全局匹配,即找到所有匹配項。
o僅對表達(dá)式求值一次。
s更改.(點)的行為以匹配所有字符,包括換行符。
x允許您在正則表達(dá)式中使用空格和注釋以保持清晰度。

以下示例將向您展示如何使用i修飾符和PHP preg_match_all()函數(shù)執(zhí)行不區(qū)分大小寫的全局搜索。

<?php
$pattern = "/color/i";
$text = "Color red is more visible than color blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
測試看看?/?

同樣,以下示例顯示如何使用^錨點和m修飾符與PHP preg_match_all()函數(shù)在多行字符串的每一行的開頭進(jìn)行匹配。

<?php
$pattern = "/^color/im";
$text = "Color red is more visible than \ncolor blue in daylight.";
$matches = preg_match_all($pattern, $text, $array);
echo $matches . " matches were found.";
?>
測試看看?/?

詞邊界

單詞邊界字符(\b)可幫助您搜索以模式開頭和/或結(jié)尾的單詞。例如,正則表達(dá)式/\bcar/匹配以模式car開頭的單詞,并匹配cart, carrot, 或 cartoon,但不匹配oscar。

同樣,正則表達(dá)式/car\b/匹配以模式car結(jié)尾的單詞,并且匹配scar, oscar, 或  supercar,但不匹配cart。同樣,/\bcar\b/匹配以單詞car開頭和結(jié)尾的單詞,并且僅匹配單詞car。

以下示例將以粗體突出顯示以car開頭的單詞:

<?php
$pattern = '/\bcar\w*/';
$replacement = '<b>$0</b>';
$text = 'Words begining with car: cart, carrot, cartoon. Words ending with car: scar, oscar, supercar.';
echo preg_replace($pattern, $replacement, $text);
?>
測試看看?/?

我們希望您已經(jīng)了解了正則表達(dá)式的基礎(chǔ)知識。要了解如何使用正則表達(dá)式驗證表單數(shù)據(jù),請查看有關(guān)PHP表單驗證的教程。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清