色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

解析posix與perl標(biāo)準(zhǔn)的正則表達(dá)式區(qū)別

正則表達(dá)式(Regular Expression,縮寫為regexp,regex或regxp),又稱正規(guī)表達(dá)式、正規(guī)表示式或常規(guī)表達(dá)式或正規(guī)化表示法或正規(guī)表示法,是指一個(gè)用 來(lái)描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來(lái)檢索和/或替換那些符合某個(gè)模式的文本 內(nèi)容。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(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)的支持并不完善),另一套來(lái)自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兼容正則沒(méi)有定界符,函數(shù)的相應(yīng)參數(shù)會(huì)被認(rèn)為是正則。

PERL兼容正則可以使用任何不是字母、數(shù)字或反斜線(/)的字符作為定界符,如果作為定界符的字符必須被用在表達(dá)式本身中,則需要用反斜線轉(zhuǎn)義。也可以使用(),{},[] 和 <> 作為定界符

修正符:

POSIX兼容正則沒(méi)有修正符。

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)元字符(.)匹配所有的字符,包括換行符。沒(méi)有此設(shè)定的話,則不包括換行符。

x(PCRE_EXTENDED):
如果設(shè)定了此修正符,模式中的空白字符除了被轉(zhuǎn)義的或在字符類中的以外完全被忽略。

e:
如果設(shè)定了此修正符,preg_replace() 在替換字符串中對(duì)逆向引用作正常的替換,將其作為 php 代碼求值,并用其結(jié)果來(lái)替換所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函數(shù)將忽略之。

A(PCRE_ANCHORED):
如果設(shè)定了此修正符,模式被強(qiáng)制為“anchored”,即強(qiáng)制僅從目標(biāo)字符串的開頭開始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果設(shè)定了此修正符,模式中的行結(jié)束($)僅匹配目標(biāo)字符串的結(jié)尾。沒(méi)有此選項(xiàng)時(shí),如果最后一個(gè)字符是換行符的話,也會(huì)被匹配在里面。如果設(shè)定了 m 修正符則忽略此選項(xiàng)。

S:
當(dāng)一個(gè)模式將被使用若干次時(shí),為加速匹配起見值得先對(duì)其進(jìn)行分析。如果設(shè)定了此修正符則會(huì)進(jìn)行額外的分析。目前,分析一個(gè)模式僅對(duì)沒(méi)有單一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的默認(rèn)匹配成為貪婪狀態(tài)的。

X(PCRE_EXTRA):
模式中的任何反斜線后面跟上一個(gè)沒(méi)有特殊意義的字母導(dǎo)致一個(gè)錯(cuò)誤,從而保留此組合以備將來(lái)擴(kuò)充。默認(rèn)情況下,一個(gè)反斜線后面跟一個(gè)沒(méi)有特殊意義的字母被當(dāng)成該字母本身。

u(PCRE_UTF8):
模式字符串被當(dāng)成UTF-8。

邏輯區(qū)隔:
POSIX兼容正則和PERL兼容正則的邏輯區(qū)隔符號(hào)作用和使用方法完全一致:
[]:包含任選一操作的相關(guān)信息。
{}:包含匹配次數(shù)的相關(guān)信息。
():包含一個(gè)邏輯區(qū)間的相關(guān)信息,可被用來(lái)進(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):
使用()包含起來(lái)的區(qū)域是一個(gè)邏輯區(qū)間,邏輯區(qū)間的主要作用是體現(xiàn)出一些字符出現(xiàn)的邏輯次序,另一個(gè)用處就是可以用來(lái)引用(可以將此區(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)的次序來(lái)標(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 換頁(yè)符 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è)匹配位置

php技術(shù)解析posix與perl標(biāo)準(zhǔn)的正則表達(dá)式區(qū)別,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 公主岭市| 新蔡县| 赤城县| 林口县| 崇州市| 新巴尔虎左旗| 阜阳市| 贵德县| 互助| 宁夏| 甘泉县| 来安县| 福州市| 万全县| 巫溪县| 吉安市| 崇礼县| 安义县| 万宁市| 盐源县| 江达县| 泽州县| 铜鼓县| 兴宁市| 溆浦县| 丰原市| 吉水县| 龙江县| 沁水县| 尚志市| 临安市| 东乌珠穆沁旗| 长沙市| 蓬溪县| 浪卡子县| 怀仁县| 米易县| 武乡县| 娄底市| 塔城市| 天津市|