解析posix與perl標(biāo)準(zhǔn)的正則表達(dá)式區(qū)別
正則表達(dá)式(Regular Expression,縮寫為regexp,regex或regxp),又稱正規(guī)表達(dá)式、正規(guī)表示式或常規(guī)表達(dá)式或正規(guī)化表示法或正規(guī)表示法,是指一個(gè)用 來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來檢索和/或替換那些符合某個(gè)模式的文本 內(nèi)容。許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的在正則表達(dá)式引擎。正則表達(dá)式這個(gè)概念最初是由 Unix中的工具軟件(例如sed和grep)普及開的。(摘自維基百科)
PHP同時(shí)使用兩套正則表達(dá)式規(guī)則,一套是由電氣和電子工程師 協(xié)會(huì)(IEEE)制定的POSIX Extended 1003.2兼容正則(事實(shí)上PHP對(duì)此標(biāo)準(zhǔn)的支持并不完善),另一套來自PCRE(Perl Compatible Regular Expression)庫(kù)提供PERL兼容正則,這是個(gè)開放源代碼的軟件,作者為 Philip Hazel。
使用POSIX兼容規(guī)則的函數(shù)有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()
使用PERL兼容規(guī)則的函數(shù)有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()
定界符:
POSIX兼容正則沒有定界符,函數(shù)的相應(yīng)參數(shù)會(huì)被認(rèn)為是正則。
PERL兼容正則可以使用任何不是字母、數(shù)字或反斜線(\)的字符作為定界符,如果作為定界符的字符必須被用在表達(dá)式本身中,則需要用反斜線轉(zhuǎn)義。也可以使用(),{},[] 和 <> 作為定界符
修正符:
POSIX兼容正則沒有修正符。
PERL兼容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字符會(huì)導(dǎo)致錯(cuò)誤):
i (PCRE_CASELESS):
匹配時(shí)忽略大小寫。
m(PCRE_MULTILINE):
當(dāng)設(shè)定了此修正符,行起始(^)和行結(jié)束($)除了匹配整個(gè)字符串開頭和結(jié)束外,還分別匹配其中的換行符(\n)的之后和之前。
s(PCRE_DOTALL):
如果設(shè)定了此修正符,模式中的圓點(diǎn)元字符(.)匹配所有的字符,包括換行符。沒有此設(shè)定的話,則不包括換行符。
x(PCRE_EXTENDED):
如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略。
e:
如果設(shè)定了此修正符,preg_replace() 在替換字符串中對(duì)逆向引用作正常的替換,將其作為 PHP 代碼求值,并用其結(jié)果來替換所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函數(shù)將忽略之。
A(PCRE_ANCHORED):
如果設(shè)定了此修正符,模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配。
D(PCRE_DOLLAR_ENDONLY):
如果設(shè)定了此修正符,模式中的行結(jié)束($)僅匹配目標(biāo)字符串的結(jié)尾。沒有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,也會(huì)被匹配在里面。如果設(shè)定了 m 修正符則忽略此選項(xiàng)。
S:
當(dāng)一個(gè)模式將被使用若干次時(shí),為加速匹配起見值得先對(duì)其進(jìn)行分析。如果設(shè)定了此修正符則會(huì)進(jìn)行額外的分析。目前,分析一個(gè)模式僅對(duì)沒有單一固定起始字符的 non-anchored 模式有用。
U(PCRE_UNGREEDY):
使“?”的默認(rèn)匹配成為貪婪狀態(tài)的。
X(PCRE_EXTRA):
模式中的任何反斜線后面跟上一個(gè)沒有特殊意義的字母導(dǎo)致一個(gè)錯(cuò)誤,從而保留此組合以備將來擴(kuò)充。默認(rèn)情況下,一個(gè)反斜線后面跟一個(gè)沒有特殊意義的字母被當(dāng)成該字母本身。
u(PCRE_UTF8):
模式字符串被當(dāng)成UTF-8。
邏輯區(qū)隔:
POSIX兼容正則和PERL兼容正則的邏輯區(qū)隔符號(hào)作用和使用方法完全一致:
[]:包含任選一操作的相關(guān)信息。
{}:包含匹配次數(shù)的相關(guān)信息。
():包含一個(gè)邏輯區(qū)間的相關(guān)信息,可被用來進(jìn)行引用操作。
|:表示“或”,[ab]和a|b是等價(jià)的。
元字符與“[]”相關(guān):
有兩組不同的元字符:一種是模式中除了方括號(hào)內(nèi)都能被識(shí)別的,還有一種是在方括號(hào)“[]”內(nèi)被識(shí)別的。
POSIX兼容正則和PERL兼容正則“[]之外”“一致”的元字符:
\ 有數(shù)種用途的通用轉(zhuǎn)義符
^ 匹配字符串的開頭
$ 匹配字符串的結(jié)尾
? 匹配0或者1
* 匹配 0 個(gè)或多個(gè)前面指定類型的字符
+ 匹配 1 個(gè)或多個(gè)前面指定類型的字符
POSIX兼容正則和PERL兼容正則“[]之外”“不一致”的元字符:
. PERL兼容正則匹配除了換行符外的任意一個(gè)字符
. POSIX兼容正則匹配任意一個(gè)字符
POSIX兼容正則和PERL兼容正則“[]之內(nèi)”“一致”的元字符:
\ 有數(shù)種用途的通用轉(zhuǎn)義符
^ 取反字符,但僅當(dāng)其為第一個(gè)字符時(shí)有效
- 指定字符ASCII范圍,仔細(xì)研究ASCII碼,你會(huì)發(fā)現(xiàn)[W-c]等價(jià)于[WXYZ\\^_`abc]
POSIX兼容正則和PERL兼容正則“[]之內(nèi)”“不一致”的元字符:
- POSIX兼容正則中[a-c-e]的指定會(huì)拋出錯(cuò)誤。
- PERL兼容正則中[a-c-e]的指定等價(jià)于[a-e]。
匹配次數(shù)與“{}”相關(guān):
POSIX兼容正則和PERL兼容正則在匹配次數(shù)方面完全一致:
{2}:表示匹配前面的字符2次
{2,}:表示匹配前面的字符2次或多次,默認(rèn)都是貪婪(盡可能多)的匹配
{2,4}:表示匹配前面的字符2次或4次
邏輯區(qū)間與“()”相關(guān):
使用()包含起來的區(qū)域是一個(gè)邏輯區(qū)間,邏輯區(qū)間的主要作用是體現(xiàn)出一些字符出現(xiàn)的邏輯次序,另一個(gè)用處就是可以用來引用(可以將此區(qū)間內(nèi)的值引用給一個(gè)變量)。后一個(gè)作用比較奇特:
<?php
$str = "http://www.163.com/";
// POSIX兼容正則:
echo ereg_replace("(.+)","<a href = \\1 >\\1</a>",$str);
// PERL兼容正則:
echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
// 顯示兩個(gè)鏈接
?>
在引用的時(shí)候,括號(hào)是可以嵌套的,邏輯次序是按照“(”出現(xiàn)的次序來標(biāo)定的。
類型匹配:
POSIX兼容正則:
[:upper:]:匹配所有的大寫字母
[:lower:]:匹配所有的小寫字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和數(shù)字
[:digit:]:匹配所有的數(shù)字
[:xdigit:]:匹配所有的十六進(jìn)制字符,等價(jià)于[0-9A-Fa-f]
[:punct:]:匹配所有的標(biāo)點(diǎn)符號(hào),等價(jià)于 [.,"'?!;:]
[:blank:]:匹配空格和TAB,等價(jià)于[ \t]
[:space:]:匹配所有的空白字符,等價(jià)于[ \t\n\r\f\v]
[:cntrl:]:匹配所有ASCII 0到31之間的控制符。
[:graph:]:匹配所有的可打印字符,等價(jià)于:[^ \t\n\r\f\v]
[:print:]:匹配所有的可打印字符和空格,等價(jià)于:[^\t\n\r\f\v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配單詞的開始
[:>:]:匹配單詞的結(jié)尾
PERL兼容正則(這里可以看出PERL正則的強(qiáng)大):
\a alarm,即 BEL 字符('0)
\cx "control-x",其中 x 是任意字符
\e escape('0B)
\f 換頁符 formfeed('0C)
\n 換行符 newline('0A)
\r 回車符 carriage return('0D)
\t 制表符 tab('0)
\xhh 十六進(jìn)制代碼為 hh 的字符
\ddd 八進(jìn)制代碼為 ddd 的字符,或 backreference
\d 任一十進(jìn)制數(shù)字
\D 任一非十進(jìn)制數(shù)的字符
\s 任一空白字符
\S 任一非空白字符
\w 任一“字”的字符
\W 任一“非字”的字符
\b 字分界線
\B 非字分界線
\A 目標(biāo)的開頭(獨(dú)立于多行模式)
\Z 目標(biāo)的結(jié)尾或位于結(jié)尾的換行符前(獨(dú)立于多行模式)
\z 目標(biāo)的結(jié)尾(獨(dú)立于多行模式)
\G 目標(biāo)中的第一個(gè)匹配位置
- PERL 正則表達(dá)式詳細(xì)說明
- Perl中的正則表達(dá)式介紹
- 關(guān)于Perl里面正則表達(dá)式規(guī)范
- POSIX 風(fēng)格和兼容 Perl 風(fēng)格兩種正則表達(dá)式主要函數(shù)的類比(preg_match, preg_replace, ereg, ereg_replace)
- 在PHP中使用與Perl兼容的正則表達(dá)式
- 一個(gè)perl擴(kuò)展正則表達(dá)式代碼分析
- 有關(guān)perl正則表達(dá)式的一些雜項(xiàng)
- PHP中基于perl的正則表達(dá)式處理函數(shù)
- 強(qiáng)大的Perl正則表達(dá)式實(shí)例詳解
相關(guān)文章
php實(shí)現(xiàn)多維數(shù)組排序的方法示例
這篇文章主要介紹了php實(shí)現(xiàn)多維數(shù)組排序的方法,結(jié)合實(shí)例形式分析了php針對(duì)多維數(shù)組的排序操作相關(guān)技巧,需要的朋友可以參考下2017-03-03
PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法分析
這篇文章主要介紹了PHP仿tp實(shí)現(xiàn)mvc框架基本設(shè)計(jì)思路與實(shí)現(xiàn)方法,簡(jiǎn)單講述了php實(shí)現(xiàn)tp框架的原理,并結(jié)合實(shí)例形式分析了相關(guān)控制器、視圖及URL訪問操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05
PHP如何實(shí)現(xiàn)訂單的延時(shí)處理詳解
這篇文章主要給大家介紹了關(guān)于利用PHP如何實(shí)現(xiàn)訂單的延時(shí)處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
mac下Apache + MySql + PHP搭建網(wǎng)站開發(fā)環(huán)境
最近接了個(gè)小活,做一個(gè)使用PHP語言和MySql數(shù)據(jù)庫(kù)的動(dòng)態(tài)網(wǎng)站。之前做過類型的網(wǎng)站,是在windows系統(tǒng)下做的,開發(fā)環(huán)境使用的是 AppServ 的PHP開發(fā)套件。現(xiàn)在有了我的大MAC,所以找了MAC系統(tǒng)下PHP環(huán)境的開發(fā)套件。2014-06-06
初步介紹PHP擴(kuò)展開發(fā)經(jīng)驗(yàn)分享
在PHP開發(fā)的過程中,有時(shí)候?yàn)榱颂岣咝阅?,需要選擇擴(kuò)展的方式去實(shí)現(xiàn),本文簡(jiǎn)單介紹怎么開發(fā)一個(gè)簡(jiǎn)單的PHP擴(kuò)展,解開PHP擴(kuò)展開發(fā)的神秘面紗2012-09-09
php數(shù)組函數(shù)序列 之shuffle()和array_rand() 隨機(jī)函數(shù)使用介紹
shuffle與array_rand定義和用法,需要的朋友可以參考下。2011-10-10
PHP實(shí)現(xiàn)處理三級(jí)分類數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用PHP實(shí)現(xiàn)處理三級(jí)分類數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-02-02

