PHP基礎複習(六)——正則表達式

前言

本系列文章主要是根據實戰視頻《360大牛:全面解讀PHP面試》學習過程中記錄的學習筆記,期間也會加入查找資料和平時學習中學習到的知識。

作用

正則表達式的作用:分割、查找、匹配、替換字符串。

 

分隔符

正斜線(/)、hash符號(#)以及取反符號(~)

 

通用原子

 \d        0-9

\D        除了0-9

\w        數字(0-9)字母(a-zA-Z)下劃線(_)

\W       除了數字(0-9)字母(a-zA-Z)下劃線(_)

\s         空白符

\S         除了空白符

元字符

.      匹配除換行符(\n、\r)之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用像"(.|\n)"的模式。

*    匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。

?    匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價於 {0,1}。

^   匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。

$    匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。

+   匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。

{n}   n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

{n,}   n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。

{n,m}  m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

[]   字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

()   匹配 pattern 並獲取這一匹配。

[^]   負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

|     匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。

[-]   字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字符。

 

模式修正符

i   不區分大小寫的匹配。

            如:"/abc/i"可以與abc或aBC或ABc等匹配。

m  將字符串視爲多行,不管是那行都能匹配。

             模式爲:$mode="/abc/m";

             要匹配的字符串爲:$str="bcefg5e\nabcdfe"

             注意其中\n,換行了;abc換到了下一行;

             $str和$mode仍可以匹配,修正符m使得多行也可匹配。

e    正則表達式必須使用在preg_replace替換字符串的函數中時纔可以使用;可以把匹配來的字符串當作正則表達式執行;preg_replace() 函數在替換字符串中對逆向引用作正常的替換,將其作爲 PHP 代碼求值,並用其結果來替換所搜索的字符串。

s    如果沒有使用這個模式修正符號,元字符中的"."默認不能表示換行符號。s將字符串視爲單行,換行符作爲普通字符。

             模式爲:$mode="/pr.y/";

             要匹配字符串爲:$str="pr\ny";

             兩者不可匹配; . 是除了換行以外的字符可匹配;

            修改下模式爲:$mode="/pr.y/s";

            其中修正符s將\n視爲普通字符,即不是換行;

            最後兩者可以匹配。

U  正則表達式的特點:就是比較“貪婪”,使用該模式修正符可以取消貪婪模式。

            如模式爲:

            $mode="/a.*c/";

            $str="abcabbbcabbbbbc" ;

            preg_match($mode,$str,$content);

            echo $content[0]; //輸出:abcabbbcabbbbbc;

            如果$mode="/a.*c/";變成$mode="/a.*c/U";

            則只匹配最近一個字符串,輸出:abc;

x  表示模式中的空白忽略不計。

A  強制從目標字符串開頭匹配;以模式字符串開頭,相當於元字符^。

            可以與$str="abcsdfi"匹配,

            不可以與$str2="sdsdabc"匹配;

            因爲$str2不是以abc開頭;

D  如果使用$限制結尾字符,則不允許結尾有換行。

            模式爲:$mode="/abc$/";

            可以與最後有換行的$str="adshabc\n"匹配;

            元子符$會忽略最後的換行\n;

            如果模式爲:$mode="/abc/D",

            則不能與$str="adshabc\n"匹配,

u   模式字符串被當成 UTF-8。

g   表示全局匹配。

難點考點(待補充)

        後向引用、貪婪模式

 

正則表達式PCRE函數

preg_match()    執行匹配正則表達式

語法:int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

                 搜索subject與pattern給定的正則表達式的一個匹配。

                matches

               如果提供了參數matches,它將被填充爲搜索結果。 $matches[0]將包含完整模式匹配到的文本, $matches[1] 將包含第一個捕獲子組匹配到的文本,以此類推。

例子:

<?php
preg_match('/(foo)(bar)(baz)/', 'foobarbaz', $matches, PREG_OFFSET_CAPTURE);

print_r($matches); //Array ( [0] => Array ( [0] => foobarbaz [1] => 0 ) [1] => Array ( [0] => foo [1] => 0 ) [2] => Array ( [0] => bar [1] => 3 ) [3] => Array ( [0] => baz [1] => 6 ) )

 

preg_match_all()  執行一個全局正則表達式匹配

語法:int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

                  搜索subject中所有匹配pattern給定正則表達式 的匹配結果並且將它們以flag指定順序輸出到matches中。

                  在第一個匹配找到後, 子序列繼續從最後一次匹配位置搜索。

 

preg_replace()   執行一個正則表達式的搜索和替換

語法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

                 搜索subject中匹配pattern的部分, 以replacement進行替換。

 

preg_split()  通過一個正則表達式分隔字符串

語法:array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

                 通過一個正則表達式分隔給定字符串.

例子:

<?php
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");

print_r($keywords); //Array ( [0] => hypertext [1] => language [2] => programming )

 

中文匹配

UTF-8漢字編碼範圍是0x4e00-0x9fa5,在ANSI(gb2312)環境下,0xb0-0xf7,0xa1-0xfe 。

UTF-8要使用u模式修正符是模式字符串被當成UTF-8,在ANSI(gb2312)環境下,要使用chr將ASCII碼轉換成字符。

 

 

參考鏈接:

https://www.cnblogs.com/yuanwanli/p/5838918.html

https://blog.csdn.net/helen_shw/article/details/56011213

http://www.runoob.com/regexp/regexp-metachar.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章