最近在學(xué)習(xí)正則表達(dá)式,發(fā)現(xiàn)原來(lái)理解的正則表達(dá)式不是特別的準(zhǔn)確,甚至有誤!在這里簡(jiǎn)單記錄一下,希望對(duì)有的朋友能夠有所幫助!
他的真正含義是"或"的意思!例如:[123],它代表的含義是,匹配一個(gè)1或2或3!
由于它經(jīng)常是用于匹配多個(gè)可能的值,所以支持一種簡(jiǎn)寫(xiě)的方式! 例如:[12345678]可以簡(jiǎn)寫(xiě)為[1-8]
[abcdefghjik]可以簡(jiǎn)寫(xiě)為[a-k] [1234567ABCDEFG]可以簡(jiǎn)寫(xiě)為[1-7A-G]
(1)在”[]”中的大部分元字符都是普通字符,都不在具有元字符的含義!但是仍然有個(gè)別的元字符除外!
“-”,“^”,目前只知道這兩個(gè),可能還有其他的,待補(bǔ)充!“-”,是作為連字符表示的是一個(gè)范圍,
1. 如果單獨(dú)的將“-”符號(hào)放在第一位的話(huà),它表示的也是一個(gè)普通的字符!例如:[a-z]這個(gè)時(shí)候就是元字符,代表的是一個(gè)范圍!
2. 在[-abc]中,"-"就是一個(gè)普通的字符,這句話(huà)就表示,匹配-、a、b、c中,這四個(gè)字符中的任意一個(gè)!
^有兩個(gè)意思,
1. 在字符簇外,它表示的是托字節(jié),匹配的是一個(gè)位置!
2. 而在字符簇中相當(dāng)于取反的意思!而且只有當(dāng)托字節(jié)放在字符簇的第一個(gè)位置的時(shí)候才會(huì)表示一個(gè)元字符!
<?php $str =<<<STR Iraq Iraqian miqra qintar aoph zaqqnumSTR; $reg = '/q[^udfg]/'; preg_match_all($reg, $str, $result); var_dump($result); 運(yùn)行結(jié)果如下 array(1) { [0]=>array(5) { [0]=> string(2) "q " [1]=> string(2) "qi"[2]=> string(2) "qr" [3]=> string(2) "qi" [4]=>string(2) "qq" } }?>
曾經(jīng)好長(zhǎng)一段時(shí)間,我個(gè)人一直認(rèn)為,[^udfg]匹配的是除了udfg中的任何一個(gè)字符,但是,很明顯我錯(cuò)了! 通過(guò)上面我們對(duì)“[]”的了解,字符簇永遠(yuǎn)匹配的是一個(gè)字符!所以,他的正解應(yīng)該是,匹配除了字符u外的任意一個(gè)字符,或者dfg中的任何一個(gè)字符!
可能會(huì)有的朋友問(wèn)Iraq中q后面匹配了什么!答案是回車(chē)(在window狀態(tài)下是\r\n)!\r并不屬于u所以匹配成功!
在heredoc的語(yǔ)法中,會(huì)完整的保留空格、制表符、回車(chē)換行!
到這里,可能有的朋友會(huì)問(wèn),那他的功能豈不是和 ”[]” 的功能重復(fù)了么?
答案顯然是否定的!個(gè)人認(rèn)為“|”,分支語(yǔ)句,在一定程度上彌補(bǔ)了“[]”符號(hào)功能的不足!因?yàn)椤癧]”,自始至終只能表示一個(gè)字字符!
例如:[a-z],他表示的匹配a-z中的任意一個(gè)字符!
而當(dāng)我們需要匹配abc或def的時(shí)候,顯然”[]”是無(wú)能為力的!而此時(shí)也正是“|”分支結(jié)構(gòu)的用處!可以寫(xiě)成(abc|def)
表示匹配abc或者def這兩個(gè)字符集中的一個(gè)!
這里我們需要明白一下元素的概念!所謂元素還包括如下的形式:[a-z]這個(gè)字符簇整體表示一個(gè)元素!(abc|def)這個(gè)分支結(jié)構(gòu)整體表示一個(gè)元素!
注意:所有的量詞都是僅作用于之前緊鄰的元素!
在正則表達(dá)式中,使用”()”包裹起來(lái)的元素被統(tǒng)一稱(chēng)為子表達(dá)式!而括號(hào)是能夠記憶“()”匹配到的內(nèi)容的,無(wú)論這些匹配到的文本是什么!(這個(gè)也就是我們常說(shuō)的反向引用!如果他是第一個(gè)的話(huà)使用\1,就可以獲得字表達(dá)式中的內(nèi)容!)
那么如果判斷是表達(dá)式幾呢?有一個(gè)原則:按照開(kāi)括號(hào)“(”從左到右的出現(xiàn)順序進(jìn)行計(jì)算!依次就是\1,\2,\3…… 注意:反向引用應(yīng)該是可以嵌套的!遵循的同樣是這個(gè)原則!看代碼:
<?php $content = 'maweibin is the author'; $regexp = "/(((ma)wei)bin)/"; preg_match($regexp, $content, $result); var_dump($result); 運(yùn)行結(jié)果如下: array(4) { [0]=> string(8) "maweibin" [1]=> string(8) "maweibin" [2]=> string(5) "mawei" [3]=> string(2) "ma" } ?>
通過(guò)結(jié)果,我們可以看到,第一個(gè)字表達(dá)式是“maweibin”,第二個(gè)字表達(dá)式是“mawei”,第三個(gè)字表達(dá)式是“ma”。
在正則表達(dá)式中“$”符號(hào),同托字節(jié)“^”一樣是匹配一個(gè)位置的!但是“$”符號(hào)本身又有一些陷阱需要我們注意!
一般情況下,我們都認(rèn)為“$”符號(hào)匹配就是一行中的最后一個(gè)位置!這個(gè)并沒(méi)有錯(cuò),但是不夠詳細(xì)!
其實(shí)$匹配的是這樣一個(gè)位置,匹配\n前或單行字串的結(jié)束位置,單行字符串結(jié)尾什么都沒(méi)有!舉例說(shuō)明:
<?php$str =<<<STRthe theorymy myselefyour yourselefSTR;$reg = '/^([a-zA-Z]+)\s*\1[a-zA-Z]*$/m';preg_match_all($reg, $str, $result);var_dump($result);運(yùn)行的結(jié)果如下array(2) { [0]=> array(1) { [0]=>string(14) "your yourselef" } [1]=> array(1) { [0]=> string(4)"your" } }?>
只有最后一個(gè)被匹配到了! 、
原因是這樣的!在window中每換一行會(huì)有隱藏字符“\r\n”存在!
$匹配\n前或字串結(jié)尾(字符串結(jié)尾,比如單獨(dú)一行的最后),\r 也是一個(gè)字符,且不在[a-zA-Z]范圍!其實(shí),我們只需要將正則改寫(xiě)為'/^([a-zA-Z]+)\s\1[a-zA-Z] \s$/m',這里只是加上了一個(gè)\s用來(lái)匹配\r這個(gè)看不見(jiàn)的字符串!
正則表達(dá)式大多數(shù)情況下是進(jìn)行單行的匹配的!但是,有時(shí)候我們也需要進(jìn)行多行的匹配,特別是在我們進(jìn)行信息采集的時(shí)候,顯得就尤為重要!
個(gè)人認(rèn)為,在php中如果我們能夠靈活的運(yùn)用php的模式修飾符,那么多行匹配就沒(méi)有什么問(wèn)題了!所以多行匹配,個(gè)人認(rèn)為就是重點(diǎn)對(duì)模式修飾符的學(xué)習(xí)!(1)m(mutiline),加上了m修飾符號(hào)的主要作用是更改了托字節(jié)”^”和“$”的應(yīng)用范圍!
黑色箭頭代表的是托字節(jié)”^”所匹配的位置,藍(lán)色箭頭是美元符號(hào)”%”所匹配的位置! 舉例說(shuō)明:
從上面,我們可以看出來(lái):在沒(méi)有m修飾符的時(shí)候,托字節(jié)^僅匹配字符串的開(kāi)始位置,
而$僅匹配字符串的末尾,或者最后的換行符號(hào)!
加上了m修飾符之后:
從上面,我們可以看出來(lái):加上m修飾符后,托字節(jié)^會(huì)匹配目標(biāo)字符串的開(kāi)始,或者任意換行符\n前面的位置; 而$會(huì)匹配目標(biāo)字符串的最末位置,或者任意換行符后面的位置!
(2)S修飾,如果設(shè)置了這個(gè)修飾符那么,模式中的元字符 “ . ” 就會(huì)匹配所有字符, 包含換行符. 如果沒(méi)有這個(gè)修飾符, 那么 “ . ”實(shí)際上匹配的是除了換行符\n外的任意字符!(3)U(這個(gè)是大寫(xiě)的ungreedy:非貪婪)。
舉例說(shuō)明:<a href=’www.baidu.com’>百度</a><a href=’www.google.com’>谷歌</a>正則如下:<a\s*href\s*=\s*’www\.baidu\.com’>.*</a>結(jié)果是把全部的字符串都匹配到了!其實(shí),我們只需要加上U修飾符,這樣,這樣一旦成功匹配一次的話(huà),正則就不會(huì)繼續(xù)進(jìn)行匹配了!
(4)i(個(gè)人認(rèn)為應(yīng)該是ingnore的意思),表示在匹配的時(shí)候忽略大小寫(xiě)。
聯(lián)系客服