国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

搞定PHP面試 - 正則表達(dá)式知識點整理

AaronYuan / 1104人閱讀

摘要:是決定正則表達(dá)式匹配規(guī)則的主要部分。二分隔符分隔符的選擇當(dāng)使用函數(shù)的時候,正則表達(dá)式必須由分隔符閉合包裹。果分隔符經(jīng)常在正則表達(dá)式內(nèi)出現(xiàn),最好使用其他分隔符來提高可讀性。需要將一個字符串放入正則表達(dá)式中使用時,可以用函數(shù)對其進(jìn)行轉(zhuǎn)義。

一、簡介 1. 什么是正則表達(dá)式

正則表達(dá)式(Regular Expression)就是用某種模式去匹配一類字符串的一種公式。
正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。
正則表達(dá)式是繁瑣的,但它是強(qiáng)大的,學(xué)會之后的應(yīng)用會讓你除了提高效率外,會給你帶來絕對的成就感。只要認(rèn)真閱讀本教程,加上應(yīng)用的時候進(jìn)行一定的參考,掌握正則表達(dá)式不是問題。
許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。

2. 正則表達(dá)式的作用

分割,查找,匹配,替換字符串

3. PHP中的正則表達(dá)式

在PHP中有兩套正則表達(dá)式函數(shù)庫,兩者功能相似,只是執(zhí)行效率略有差異:

一套是由 PCRE(Perl Compatible Regular Expression) 庫提供的。使用“preg_”為前綴命名的函數(shù);
一套由 POSIX(Portable Operating System Interface of Unix )擴(kuò)展提供的。使用以“ereg_”為前綴命名的函數(shù);

PCRE來源于Perl語言,而Perl是對字符串操作功能最強(qiáng)大的語言之一,PHP的最初版本就是由Perl開發(fā)的產(chǎn)品。
PCRE語法支持更多特性,比POSIX語法更強(qiáng)大。因此,本文主要介紹 PCRE 語法的正則表達(dá)式

4. 正則表達(dá)式的組成

在PHP中,一個正則表達(dá)式分為三個部分:分隔符、表達(dá)式和模式修飾符。

分隔符

分隔符可以使用除字母、數(shù)字、反斜線()和空白字符之外的任意 ascii 字符。
最常用的分隔符有正斜線(/)、hash符號(#) 以及取反符號(~)。

表達(dá)式

有一些特殊字符和非特殊的字符串組成。是決定正則表達(dá)式匹配規(guī)則的主要部分。

模式修飾符

用于開啟和關(guān)閉某些特定的功能/模式。

二、分隔符 1. 分隔符的選擇

當(dāng)使用 PCRE 函數(shù)的時候,正則表達(dá)式必須由分隔符閉合包裹。
分隔符可以使用除字母、數(shù)字、反斜線()和空白字符之外的任意 ascii 字符。
最常用的分隔符有正斜線(/)、hash符號(#) 以及取反符號(~)。

/foo bar/ (合法)
#^[^0-9]$# (合法)
+php+    (合法)
%[a-zA-Z0-9_-]%    (合法)
#[a-zA-Z0-9_-]/    (非法,兩邊的分隔符不同)
a[a-zA-Z0-9_-]a    (非法,分隔符不能是字母)
[a-zA-Z0-9_-]    (非法,分隔符不能是反斜線(``))

除了上面提到的分隔符,也可以使用括號樣式的分隔符,左括號和右括號分別作為開始和結(jié)束 分隔符。

{this is a pattern}
2. 分隔符的使用

如果分隔符 在正則表達(dá)式中使用,它必須使用反斜線()進(jìn)行轉(zhuǎn)義。
果分隔符經(jīng)常在正則表達(dá)式內(nèi)出現(xiàn), 最好使用其他分隔符來提高可讀性。

/http:///
#http://#

需要將一個字符串放入正則表達(dá)式中使用時,可以用 preg_quote() 函數(shù)對其進(jìn)行轉(zhuǎn)義。 它的第二個參數(shù)(可選)可以用于指定需要被轉(zhuǎn)義的分隔符。

//在這個例子中,preg_quote($word) 用于保持星號和正斜杠(/)原文涵義,使其不使用正則表達(dá)式中的特殊語義。
$textBody = "This book is */very/* difficult to find.";
$word = "*/very/*";
$reg = "/" . preg_quote($word, "/") . "/";

echo $reg; // 輸出 "/*/very/*/"

echo preg_replace ($reg, "" . $word . "", $textBody); // 輸出 "This book is */very/* difficult to find."

可以在結(jié)束分隔符后面增加模式修飾符來影響匹配效果。
下面的例子是一個大小寫不敏感的匹配

#[a-z]#i
三、元字符 1. 轉(zhuǎn)義符
字符 描述
將下一個字符標(biāo)記為一個特殊字符、或一個原義字符、或一個 向后引用。
例如,"n" 匹配字符 "n"。"n" 匹配一個換行符。序列 "" 匹配 "" 而 "(" 則匹配 "("。
2. 定位符
字符 描述
^ 匹配輸入字符串的開始位置 (或在多行模式下是行首)
$ 匹配輸入字符串的結(jié)束位置 (或在多行模式下是行尾)
 匹配一個單詞邊界,即字與空格間的位置
B 非單詞邊界匹配
3. 限定符
字符 描述
* 匹配前面的子表達(dá)式零次或多次。
例如,zo 能匹配 "z" 以及 "zoo"。 等價于{0,}。
+ 匹配前面的子表達(dá)式一次或多次。
例如,"zo+" 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。
? 當(dāng)該字符作為量詞,表示匹配前面的子表達(dá)式零次或一次。
例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價于 {0,1}。
{n} n 是一個非負(fù)整數(shù)。匹配確定的 n 次。
例如,"o{2}" 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負(fù)整數(shù)。至少匹配n 次。
例如,"o{2,}" 不能匹配 "Bob" 中的 "o",但能匹配 "foooood" 中的所有 o。"o{1,}" 等價于 "o+"。"o{0,}" 則等價于 "o*"。
{n,m} m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。
例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。"o{0,1}" 等價于 "o?"。請注意在逗號和兩個數(shù)之間不能有空格。
4. 通用字符
字符 描述
d 匹配一個數(shù)字字符。等價于 [0-9]
D 匹配一個非數(shù)字字符。等價于 [^0-9]
w 匹配字母、數(shù)字、下劃線。等價于 [A-Za-z0-9_]
W 匹配非字母、數(shù)字、下劃線。等價于 [^A-Za-z0-9_]
s 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ f v]
S 匹配任何非空白字符。等價于 [^ f v]
. 匹配除換行符(n、r)之外的任何單個字符。
要匹配包括 "n" 在內(nèi)的任何字符,請使用像"(.
n)"的正則表達(dá)式。
5. 非打印字符
字符 描述
匹配一個換行符。等價于 x0a 和 cJ。
匹配一個回車符。等價于 x0d 和 cM。
匹配一個制表符。等價于 x09 和 cI。
6. 多選分支符
字符 描述
| 豎線字符 | 可以匹配多選一的情況。
例如,"z|food" 能匹配 "z" 或 "food"。"(z|f|g)ood" 則匹配 "zood"、"food"或 "good"。
7. 字符組
字符 描述
[x|y] 匹配 x 或 y。
例如,"z|food" 能匹配 "z" 或 "food"。"(z|f)ood" 則匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一個字符。
例如, [abc] 可以匹配 "plain" 中的 "a"。
[^xyz] 負(fù)值字符集合。匹配未包含的任意字符。
例如, [^abc] 可以匹配 "plain" 中的"p"、"l"、"i"、"n"。
[a-z] 字符范圍。匹配指定范圍內(nèi)的任意字符。
例如,[a-z] 可以匹配 "a" 到 "z" 范圍內(nèi)的任意小寫字母字符。
[^a-z] 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。
例如,[^a-z] 可以匹配任何不在 "a" 到 "z" 范圍內(nèi)的任意字符。
8. 非貪婪匹配符
字符 描述
? 當(dāng)該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。
非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。
例如,對于字符串 "oooo","o+?" 將匹配單個 "o",而 "o+" 將匹配所有 "o"。
9. ( )分組
字符 描述
(pattern) 匹配 pattern 并獲取這一匹配。要匹配圓括號字符,請使用 ()
(?:pattern) 匹配 pattern 但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配,不進(jìn)行存儲供以后使用。這在使用 "或" 字符 (|) 來組合一個正則表達(dá)式的各個部分是很有用。
例如, "industr(?:y|ies) 就是一個比 "industry|industries" 更簡略的表達(dá)式。
(?=pattern) 正向肯定預(yù)查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。
例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。
(?!pattern) 正向否定預(yù)查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。
例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。
(?<=pattern) 反向(look behind)肯定預(yù)查,與正向肯定預(yù)查類似,只是方向相反。
例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。
(? 反向否定預(yù)查,與正向否定預(yù)查類似,只是方向相反。
例如"(?
四、模式修飾符 1. i(不區(qū)分大小寫)

如果設(shè)置了這個修飾符,正則表達(dá)式中的字母會進(jìn)行大小寫不敏感匹配。

2. m(多行模式)

默認(rèn)情況下,PCRE 認(rèn)為目標(biāo)字符串是由單行字符組成的(然而實際上它可能會包含多行)。
"行首"元字符 (^) 僅匹配字符串的開始位置, 而"行末"元字符 ($) 僅匹配字符串末尾, 或者最后的換行符(除非設(shè)置了 D 修飾符)。

當(dāng)這個修飾符設(shè)置之后,“行首”元字符 (^) 和“行末”元字符 ($) 就會匹配目標(biāo)字符串中任意換行符之前或之后,另外,還分別匹配目標(biāo)字符串的最開始和最末尾位置。

如果目標(biāo)字符串 中沒有 "n" 字符,或者正則表達(dá)式中沒有出現(xiàn) ^$,設(shè)置這個修飾符不產(chǎn)生任何影響。

3. s(點號通配模式)

默認(rèn)情況下,點號(.)不匹配換行符。
如果設(shè)置了這個修飾符,正則表達(dá)式中的點號元字符匹配所有字符,包含換行符。

4. U(貪婪模式)

這個修飾符與前面提到的 ? 作用相同,使正則表達(dá)式默認(rèn)為非貪婪匹配。
在使用U修飾符的情況下,再在量詞后加 ? ,可以使其轉(zhuǎn)為貪婪匹配(負(fù)負(fù)得正)。

在非貪婪模式,通常不能匹配超過 pcre.backtrack_limit 的字符。
貪婪模式
$str = "abcdef";
$pattern = "|(.*)|";
preg_match_all($pattern, $str, $matches);

.*會匹配 abcdef

在使用U修飾符的情況下,再在量詞后加 ? ,負(fù)負(fù)得正,依然是貪婪匹配

$str = "abcdef";
$pattern = "|(.*?)|U";
preg_match_all($pattern, $str, $matches);

.*會匹配 abcdef

非貪婪模式

方法一、使用 ? 轉(zhuǎn)為非貪婪模式

$str = "abcdef";
$pattern = "|(.*?)|";
preg_match_all($pattern, $str, $matches);

.*會分別匹配 abcdef

方法二、使用修飾符 U 轉(zhuǎn)為非貪婪模式

$str = "abcdef";
$pattern = "|(.*)|U";
preg_match_all($pattern, $str, $matches);

.*會分別匹配 abcdef

5. u(支持UTF-8轉(zhuǎn)義表達(dá))

此修正符使正則表達(dá)式和目標(biāo)字符串都被認(rèn)為是 utf-8 編碼。
無效的目標(biāo)字符串會導(dǎo)致 preg_* 函數(shù)什么都匹配不到;無效的正則表達(dá)式字符串會導(dǎo)致 E_WARNING 級別的錯誤。

$str = "中文";

$pattern = "/^[x{4e00}-x{9fa5}]+$/u";

if (preg_match($pattern, $str)) {
    echo "該字符串全是中文";
} else {
    echo "該字符串不全是中文";
}
6. D(結(jié)尾限制)

默認(rèn)情況下,如果使用 $ 限制結(jié)尾字符,當(dāng)字符串以一個換行符結(jié)尾時, $符號還會匹配該換行符(但不會匹配之前的任何換行符)。
如果設(shè)置這個修飾符,正則表達(dá)式中的 $ 符號僅匹配目標(biāo)字符串的末尾。
如果設(shè)置了修飾符 m,這個修飾符被忽略。

7. x

如果設(shè)置了這個修飾符,正則表達(dá)式中的沒有經(jīng)過轉(zhuǎn)義的或不在字符類中的空白數(shù)據(jù)字符總會被忽略, 并且位于一個未轉(zhuǎn)義的字符類外部的#字符和下一個換行符之間的字符也被忽略。

8. A

如果設(shè)置了這個修飾符,正則表達(dá)式被強(qiáng)制為"錨定"模式,也就是說約束匹配使其僅從 目標(biāo)字符串的開始位置搜索。

9. S

當(dāng)一個正則表達(dá)式需要多次使用的時候,為了得到匹配速度的提升,值得花費(fèi)一些時間對其進(jìn)行一些額外的分析。
如果設(shè)置了這個修飾符,這個額外的分析就會執(zhí)行。
當(dāng)前,這種對一個正則表達(dá)式的分析僅僅適用于非錨定模式的匹配(即沒有多帶帶的固定開始字符)。

五、反向引用

使用 ( ) 標(biāo)記的開始和結(jié)束的多個原子,不僅是一個獨立的單元,也是一個子表達(dá)式。
在一個 ( ) 中的子表達(dá)式外面,反斜線緊跟一個大于 0 的數(shù)字,就是對之前出現(xiàn)的某個子表達(dá)式的后向引用。
后向引用用于重復(fù)搜索前面某個 ( ) 中的子表達(dá)式匹配的文本。

1. 在正則表達(dá)式中使用反向引用

(sens|respons)e and 1ibility 將會匹配 ”sense and sensibility” 和 ”response and responsibility”, 而不會匹配 ”sense and responsibility”

2. 在PCRE函數(shù)中使用反向引用
abcdef";
$pattern = "/(.*)(.*)/";
$replace = preg_replace($pattern, "1", $str);
echo $replace . "
";

$replace = preg_replace($pattern, "2", $str);
echo $replace . "
";

輸出:

abc
def
六、正則表達(dá)式常用PCRE函數(shù)
PHP官網(wǎng)的講解已經(jīng)很詳細(xì)了,這里不再做多余的論述
執(zhí)行正則表達(dá)式匹配 preg_match() 執(zhí)行正則表達(dá)式全局匹配 preg_match_all() 執(zhí)行一個正則表達(dá)式的搜索和替換 preg_replace() 執(zhí)行一個正則表達(dá)式搜索并且使用一個回調(diào)進(jìn)行替換 preg_replace_callback() 執(zhí)行多個正則表達(dá)式搜索并且使用對應(yīng)回調(diào)進(jìn)行替換 preg_replace_callback_array() 通過一個正則表達(dá)式分隔字符串 preg_split() 七、應(yīng)用實踐 1. 正則表達(dá)式匹配中文

UTF-8漢字編碼范圍是 0x4e00-0x9fa5
在ANSI(GB2312)環(huán)境下,0xb0-0xf70xa1-0xfe

UTF-8要使用 u模式修正符 使模式字符串被當(dāng)成 UTF-8
在ANSI(GB2312)環(huán)境下,要使用chr將Ascii碼轉(zhuǎn)換為字符

UTF-8

ANSI(GB2312)

2. 正則表達(dá)式匹配頁面中所有img標(biāo)簽中的src的值。
/i";

preg_match($pattern, $str, $match);

var_dump($match);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29930.html

相關(guān)文章

  • 搞定PHP面試 - 變量知識整理

    摘要:聲明靜態(tài)變量時不能用表達(dá)式的結(jié)果對其賦值正確錯誤使用表達(dá)式的結(jié)果賦值錯誤使用表達(dá)式的結(jié)果賦值靜態(tài)變量與遞歸函數(shù)靜態(tài)變量提供了一種處理遞歸函數(shù)的方法。 一、變量的定義 1. 變量的命名規(guī)則 變量名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。 $Var_1 = foo; // 合法 $var1 = foo; // 合法 $_var1 = foo; // 合法 $Var-1 = foo; /...

    Mertens 評論0 收藏0
  • 搞定PHP面試 - 運(yùn)算符知識整理

    摘要:除法運(yùn)算符總是返回浮點數(shù)。取模運(yùn)算符的結(jié)果和被除數(shù)的符號正負(fù)號相同。使用位運(yùn)算符時要特別注意優(yōu)先級。太空船運(yùn)算符組合比較符當(dāng)小于等于大于時分別返回一個小于等于大于的值。遞增遞減運(yùn)算符不影響布爾值。 一、算術(shù)運(yùn)算符 1. 概覽 例子 名稱 結(jié)果 $a + $b 加法 $a 和 $b 的和。 $a - $b 減法 $a 和 $b 的差。 $a * $b 乘法 $a 和 ...

    HelKyle 評論0 收藏0
  • 搞定PHP面試 - 函數(shù)知識整理

    摘要:使用中文函數(shù)名和變量名面積長寬長寬面積合法,輸出中文符號函數(shù)名。類型聲明類型聲明允許函數(shù)在調(diào)用時要求參數(shù)為特定類型。需要使用自己的包裝函數(shù)來將這些結(jié)構(gòu)用作可變函數(shù)。匿名函數(shù)目前是通過類來實現(xiàn)的。 一、函數(shù)的定義 1. 函數(shù)的命名規(guī)則 函數(shù)名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。 function Func_1(){ } //合法 function func1(){ } //合法 ...

    SimpleTriangle 評論0 收藏0
  • 搞定PHP面試 - MySQL基礎(chǔ)知識整理 - 存儲引擎

    摘要:支持崩潰后的安全恢復(fù)。的使用場景更新密集的表存儲引擎特別適合處理多重并發(fā)的更新請求。外鍵約束支持外鍵的存儲引擎只有。引擎是及之前版本的默認(rèn)存儲引擎。文件存儲表的索引。引擎存儲引擎是引擎的變種。 MySQL基礎(chǔ)知識點整理 - 存儲引擎 0. 查看 MySQL 支持的存儲引擎 可以在 mysql 客戶端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

    whatsns 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<