PHP函數(shù)參考23-正則相關(guān)函數(shù)



原文:
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[0]將包含完整模式匹配到的文本畦徘,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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載帮非,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末讹蘑,一起剝皮案震驚了整個(gè)濱河市喜鼓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衔肢,老刑警劉巖庄岖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異角骤,居然都是意外死亡隅忿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門邦尊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背桐,“玉大人,你說我怎么就攤上這事蝉揍×辞停” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵又沾,是天一觀的道長(zhǎng)弊仪。 經(jīng)常有香客問我熙卡,道長(zhǎng),這世上最難降的妖魔是什么励饵? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任驳癌,我火速辦了婚禮,結(jié)果婚禮上役听,老公的妹妹穿的比我還像新娘颓鲜。我一直安慰自己,他們只是感情好典予,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布甜滨。 她就那樣靜靜地躺著,像睡著了一般瘤袖。 火紅的嫁衣襯著肌膚如雪衣摩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天孽椰,我揣著相機(jī)與錄音,去河邊找鬼凛篙。 笑死黍匾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呛梆。 我是一名探鬼主播锐涯,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼填物!你這毒婦竟也來了纹腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滞磺,失蹤者是張志新(化名)和其女友劉穎升薯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體击困,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涎劈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阅茶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛛枚。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脸哀,靈堂內(nèi)的尸體忽然破棺而出蹦浦,到底是詐尸還是另有隱情,我是刑警寧澤撞蜂,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布盲镶,位于F島的核電站侥袜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏徒河。R本人自食惡果不足惜系馆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顽照。 院中可真熱鬧由蘑,春花似錦、人聲如沸代兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)植影。三九已至裳擎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間思币,已是汗流浹背鹿响。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷饿,地道東北人惶我。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像博投,于是被迫代替她去往敵國(guó)和親绸贡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 文章來自:zhouxiaoshuai 正則表達(dá)式 題: 寫出一個(gè)驗(yàn)證139開頭的手機(jī)號(hào)的正則表達(dá)式 考點(diǎn): 手機(jī)號(hào)...
    Monkey_zhou閱讀 443評(píng)論 0 0
  • 正則表達(dá)式介紹 正則表達(dá)式簡(jiǎn)介 正則表達(dá)式是用于描述字符排列和匹配模式的一種語(yǔ)法規(guī)則毅哗。它主要用于字符串的模式分割听怕、...
    dptms閱讀 10,935評(píng)論 1 9
  • PHP代碼執(zhí)行函數(shù) eval & assert & preg_replace eval 函數(shù) php官方手冊(cè):ht...
    xaviershun閱讀 5,084評(píng)論 1 12
  • 關(guān)于PCRE的介紹以及實(shí)現(xiàn)正則表達(dá)式功能的所有說明,都可以在官方手冊(cè)中看到:正則表達(dá)式(兼容 Perl) 一虑绵、認(rèn)識(shí)...
    拿破侖蛋糕閱讀 1,614評(píng)論 0 1
  • 今天感恩節(jié)哎尿瞭,感謝一直在我身邊的親朋好友。感恩相遇翅睛!感恩不離不棄筷厘。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評(píng)論 0 11