原文:
PHP函數(shù)參考23-正則相關(guān)函數(shù) - 9ong
PHP函數(shù)參考24-常用字符串函數(shù) - 9ong
PCRE
PCRE 庫(kù)是一個(gè)實(shí)現(xiàn)了與 perl 5 在語(yǔ)法和語(yǔ)義上略有差異(詳見下文)的正則表達(dá)式模式匹配功能的函數(shù)集。當(dāng)前的實(shí)現(xiàn)對(duì)應(yīng)于 perl 5.005。
正則表達(dá)式是一個(gè)從左到右匹配目標(biāo)字符串的模式嘉冒。大多數(shù)字符自身就代表一個(gè)匹配它們自身的模式问芬。
PCRE除了要了解正則表達(dá)式外迅栅,有一些特殊的知識(shí)點(diǎn):
分隔符
當(dāng)使用 PCRE 函數(shù)的時(shí)候捎谨,模式需要由分隔符閉合包裹曼库。分隔符可以使任意非字母數(shù)字慈省、非反斜線(通常說的轉(zhuǎn)義符\)臀防、非空白字符。
經(jīng)常使用的分隔符是正斜線(/)、hash符號(hào)(#) 以及取反符號(hào)(~)袱衷。
比如以下都是合法的:
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%
除了上面提到的分隔符捎废,也可以使用括號(hào)樣式的分隔符,左括號(hào)和右括號(hào)分別作為開始和結(jié)束分隔符致燥。
{this is a pattern}
元字符
參考:正則表達(dá)式
子組/子模式
子組通過圓括號(hào)()分隔界定登疗,并且它們可以嵌套。將一個(gè)模式中的一部分標(biāo)記為子組(子模式)主要是來做兩件事情:
將可選分支局部化嫌蚤。比如辐益,模式cat(arcat|erpillar|)匹配 "cat", "cataract"脱吱, "caterpillar" 中的一個(gè)智政,如果沒有圓括號(hào)的話,它匹配的則是 "cataract"箱蝠, "erpillar" 以及空字符串续捂。
將子組設(shè)定為捕獲子組。當(dāng)整個(gè)模式匹配后宦搬,目標(biāo)字符串中匹配子組的部分將會(huì)通過 pcre_exec() 的 ovector 參數(shù)回傳給調(diào)用者疾忍。左括號(hào)從左至右出現(xiàn)的次序就是對(duì)應(yīng)子組的下標(biāo)(從 1 開始),可以通過這些下標(biāo)數(shù)字來獲取捕獲子模式匹配結(jié)果床三。 下標(biāo) 0 獲取的是整個(gè)字符串一罩。
常用模式修飾符
i (PCRE_CASELESS),如果設(shè)置了這個(gè)修飾符撇簿,模式中的字母會(huì)進(jìn)行大小寫不敏感匹配
s (PCRE_DOTALL)如果設(shè)置了這個(gè)修飾符聂渊,模式中的點(diǎn)號(hào)元字符匹配所有字符,包含換行符四瘫。如果沒有這個(gè)修飾符汉嗽,點(diǎn)號(hào)不匹配換行符。
區(qū)別于POSIX函數(shù)
自 PHP 5.3.0起找蜜, POSIX 正則表達(dá)式擴(kuò)展被廢棄饼暑。請(qǐng)盡量使用PCRE函數(shù),也就是preg_前綴的函數(shù):
POSIX | PCRE |
---|---|
ereg_replace() | preg_replace() |
ereg() | preg_match() |
eregi_replace() | preg_replace() |
eregi() | preg_match() |
split() | preg_split() |
spliti() | preg_split() |
sql_regcase() | 無對(duì)等函數(shù) |
PCRE函數(shù)
-
preg_match — 執(zhí)行匹配正則表達(dá)式
搜索subject與pattern給定的正則表達(dá)式的一個(gè)匹配洗做。
preg_match( string $pattern, string $subject[, array &$matches[, int $flags = 0[, int $offset = 0]]] ) : int
pattern:要搜索的模式弓叛,字符串類型。
subject:輸入字符串诚纸。
matches:如果提供了參數(shù)matches撰筷,它將被填充為搜索結(jié)果。
matches[1] 將包含第一個(gè)捕獲子組匹配到的文本毕籽,以此類推抬闯。
flags:具體使用參考官方文檔,比較少使用关筒。
offset:通常溶握,搜索從目標(biāo)字符串的開始位置開始≌舨ィ可選參數(shù) offset 用于指定從目標(biāo)字符串的某個(gè)位置開始搜索(單位是字節(jié))奈虾。
注意:preg_match()返回 pattern 的匹配次數(shù)。它的值將是0次(不匹配)或1次廉赔,因?yàn)閜reg_match()在第一次匹配后將會(huì)停止搜索。preg_match_all()不同于此匾鸥,它會(huì)一直搜索subject 直到到達(dá)結(jié)尾蜡塌。如果發(fā)生錯(cuò)誤preg_match()返回 FALSE。
-
preg_match_all — 執(zhí)行一個(gè)全局正則表達(dá)式匹配
搜索subject中所有匹配pattern給定正則表達(dá)式的匹配結(jié)果并且將它們以flag指定順序輸出到matches中勿负。
在第一個(gè)匹配找到后, 子序列繼續(xù)從最后一次匹配位置搜索馏艾。
與preg_match函數(shù)是相似的,區(qū)別在于preg_match_all()不同于此奴愉,它會(huì)一直搜索subject 直到到達(dá)結(jié)尾琅摩。
preg_match_all("|<[^>]+>(.*)</[^>]+>|U", "<b>example: </b><div align=left>this is a test</div>", $out, PREG_PATTERN_ORDER); echo $out[0][0] . ", " . $out[0][1] . "\n"; echo $out[1][0] . ", " . $out[1][1] . "\n";
輸出:
<b>example: </b>, <div align=left>this is a test</div> example: , this is a test
可以通過flag參數(shù)調(diào)整matchs多維數(shù)組返回元素的結(jié)構(gòu):
flag默認(rèn)為PREG_PATTERN_ORDER,我們還可以設(shè)置PREG_SET_ORDER锭硼,則輸出:<b>example: </b>, example: <div align=left>this is a test</div>, this is a test
-
preg_grep — 返回匹配模式的數(shù)組元素
返回給定數(shù)組input中與模式pattern 匹配的元素組成的數(shù)組.房资。數(shù)組的key使用匹配元素在原數(shù)組的key。
preg_grep( string $pattern, array $input[, int $flags = 0] ) : array
匹配數(shù)組中是浮點(diǎn)數(shù)的元素:
$array = ["1.2","3",'45','6.7','8.0','9']; $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array); print_r($fl_array);
輸出:
Array ( [0] => 1.2 [3] => 6.7 [4] => 8.0 )
-
preg_split — 通過一個(gè)正則表達(dá)式分隔字符串
preg_split( string $pattern, string $subject[, int $limit = -1[, int $flags = 0]] ) : array
通過一個(gè)正則表達(dá)式分隔給定字符串檀头。返回一個(gè)使用 pattern 邊界分隔 subject 后得到的子串組成的數(shù)組轰异, 或者在失敗時(shí)返回 FALSE。
如果指定limit參數(shù)暑始,將限制分隔得到的子串最多只有l(wèi)imit個(gè)搭独,返回的最后一個(gè)子串將包含所有剩余部分。limit值為-1廊镜, 0或null時(shí)都代表"不限制"牙肝。
注意:如果不需要正則表達(dá)式功能,可以有更快(并且更簡(jiǎn)單)的選擇比如 explode() 或 str_split()嗤朴。
flag設(shè)置為PREG_SPLIT_NO_EMPTY可以用于過濾空串配椭。
-
preg_replace — 執(zhí)行一個(gè)正則表達(dá)式的搜索和替換
preg_replace( mixed $pattern, mixed $replacement, mixed $subject[, int $limit = -1[, int &$count]] ) : mixed
搜索 subject 中匹配 pattern 的部分,以 replacement 進(jìn)行替換雹姊。
參數(shù):replacement
用于替換的字符串或字符串?dāng)?shù)組颂郎。如果這個(gè)參數(shù)是一個(gè)字符串,并且 pattern 是一個(gè)數(shù)組容为,那么所有的模式都使用這個(gè)字符串進(jìn)行替換乓序。如果 pattern 和 replacement 都是數(shù)組寺酪,每個(gè) pattern 使用 replacement 中對(duì)應(yīng)的元素進(jìn)行替換。如果 replacement 中的元素比 pattern 中的少替劈,多出來的 pattern 使用空字符串進(jìn)行替換寄雀。
$string = 'The quick brown brown fox jumps over the lazy dog.'; $patterns = array(); $patterns[0] = '/quick/'; $patterns[1] = '/brown/'; $patterns[2] = '/fox/'; $replacements = array(); $replacements[2] = 'bear'; $replacements[1] = 'black'; $replacements[0] = 'slow'; echo preg_replace($patterns, $replacements, $string);//輸出:The bear black black slow jumps over the lazy dog. //ksort($replacements); //ksort($patterns); //這里注意兩個(gè)數(shù)組元素排序,并不是匹配patterns[0]并替換replaces[0]陨献,如果沒有ksort的操作盒犹,將會(huì)是替換replaces[2]。注意數(shù)組元素的物理順序眨业。 //echo preg_replace($patterns, $replacements, $string);//輸出:The slow black black bear jumps over the lazy dog.
$string = 'Mayl 10, 2020'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = '${1}1,$3'; echo preg_replace($pattern, $replacement, $string); //輸出:Mayl1,2020
-
preg_replace_callback — 執(zhí)行一個(gè)正則表達(dá)式搜索并且使用一個(gè)回調(diào)進(jìn)行替換
這個(gè)函數(shù)的行為除了可以指定一個(gè) callback 替代 replacement 進(jìn)行替換字符串的計(jì)算急膀,其他方面等同于 preg_replace()。
preg_replace_callback_array — Perform a regular expression search and replace using callbacks
-
preg_filter — 執(zhí)行一個(gè)正則表達(dá)式搜索和替換
preg_filter()等價(jià)于preg_replace() 除了它僅僅返回(可能經(jīng)過轉(zhuǎn)化)與目標(biāo)匹配的結(jié)果龄捡。
-
preg_quote — 轉(zhuǎn)義正則表達(dá)式字符
preg_quote()需要參數(shù) str 并向其中每個(gè)正則表達(dá)式語(yǔ)法中的字符前增加一個(gè)反斜線卓嫂。 這通常用于你有一些運(yùn)行時(shí)字符串需要作為正則表達(dá)式進(jìn)行匹配的時(shí)候。
正則表達(dá)式特殊字符有: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : - #
注意 / 不是正則表達(dá)式特殊字符聘殖。
preg_last_error — 返回最后一個(gè)PCRE正則執(zhí)行產(chǎn)生的錯(cuò)誤代碼
-
preg_last_error_msg — 返回最后一次執(zhí)行PCRE regex的錯(cuò)誤消息
成功時(shí)返回錯(cuò)誤消息晨雳,如果沒有發(fā)生錯(cuò)誤,則返回“No error”奸腺。當(dāng)然這個(gè)函數(shù)需要php8之后才支持餐禁。
POSIX正則函數(shù)
該特性在PHP 5.3.0中已棄用,在PHP 7.0.0中已刪除突照。
POSIX的相關(guān)函數(shù)都可以通過PCRE函數(shù)來代替:
POSIX | PCRE |
---|---|
ereg_replace() | preg_replace() |
ereg() | preg_match() |
eregi_replace() | preg_replace() |
eregi() | preg_match() |
split() | preg_split() |
spliti() | preg_split() |
sql_regcase() | 無對(duì)等函數(shù) |
原文:
PHP函數(shù)參考23-正則相關(guān)函數(shù) - 9ong
PHP函數(shù)參考24-常用字符串函數(shù) - 9ong