日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

學(xué)習(xí)動(dòng)態(tài)網(wǎng)頁(yè)制作PHP技術(shù)的正則表達(dá)式_PHP教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:單元測(cè)試對(duì)PHP代碼的檢查
測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)和單元測(cè)試是確保代碼在經(jīng)過(guò)修改和重大調(diào)整之后依然能如我們期望的一樣工作的最新方法。在本文中,您將學(xué)習(xí)到如何在模塊、數(shù)據(jù)庫(kù)和用戶界面(UI)層對(duì)自己的 PHP 代碼進(jìn)行單元測(cè)試。 現(xiàn)在是凌晨 3 點(diǎn)。我們?cè)鯓硬拍苤雷约旱拇a依然在工作呢?

正則表達(dá)式難于書(shū)寫(xiě)、難于閱讀、難于維護(hù),經(jīng)常錯(cuò)誤匹配意料不到的文本或者錯(cuò)過(guò)了有效的文本,這些問(wèn)題都是由正則表達(dá)式的表現(xiàn)和能力引起的。每個(gè)元字符(metacharacter)的能力和細(xì)微差別組合在一起,使得代碼不借助于智力技巧就無(wú)法解釋。

許多包含一定特性的工具使閱讀和編寫(xiě)正則表達(dá)式變得容易了,但是它們又很不符合習(xí)慣。對(duì)于很多程序員來(lái)說(shuō),書(shū)寫(xiě)正則表達(dá)式就是一種魔法藝術(shù)。他們堅(jiān)持自己所知道的特征并持有絕對(duì)樂(lè)觀的態(tài)度。如果你愿意采用本文所探討的五個(gè)習(xí)慣,你將可以讓你設(shè)計(jì)的正則表達(dá)式經(jīng)受的住反復(fù)試驗(yàn)。

本文將使用Perl、PHP和Python語(yǔ)言作為代碼示例,但是本文的建議幾乎適用于任何替換表達(dá)式(regex)的執(zhí)行。

一、使用空格和注釋

對(duì)于大部分程序員來(lái)說(shuō),在一個(gè)正則表達(dá)式環(huán)境里使用空格和縮進(jìn)排列都不成問(wèn)題,如果他們沒(méi)有這么做一定會(huì)被同行甚至外行人士看笑話。幾乎每個(gè)人都知道把代碼擠在一行會(huì)難于閱讀、書(shū)寫(xiě)和維護(hù)。對(duì)于正則表達(dá)式又有什么不同呢?

大部分替換表達(dá)式工具都具有擴(kuò)展的空格特性,這允許程序員把他們的正則表達(dá)式擴(kuò)展為多行,并在每一行結(jié)尾加上注釋。為什么只有少部分程序員利用這個(gè)特性呢?Perl 6的正則表達(dá)式默認(rèn)就是擴(kuò)展空格的模式。不要再讓語(yǔ)言替你默認(rèn)擴(kuò)展空格了,自己主動(dòng)利用吧。

記住擴(kuò)展空格的竅門(mén)之一就是讓正則表達(dá)式引擎忽略擴(kuò)展空格。這樣如果你需要匹配空格,你就不得不明確說(shuō)明。

在Perl語(yǔ)言里面,在正則表達(dá)式的結(jié)尾加上x(chóng),這樣“m/foo|bar/”變?yōu)槿缦滦问剑?/p>

m/

foo

|

bar

/x

在PHP語(yǔ)言里面,在正則表達(dá)式的結(jié)尾加上x(chóng),這樣“"/foo|bar/"”變?yōu)槿缦滦问剑?/p>

"/

foo

|

bar

/x"

在Python語(yǔ)言里面,傳遞模式修飾參數(shù)“re.VERBOSE”得到編譯函數(shù)如下:

pattern = r'''

foo

|

bar

'''

regex = re.compile(pattern, re.VERBOSE)

處理更加復(fù)雜的正則表達(dá)式時(shí),空格和注釋就更能體現(xiàn)出其重要性。假設(shè)下面的正則表達(dá)式用于匹配美國(guó)的電話號(hào)碼:

\(?\d{3}\)? ?\d{3}[-.]\d{4}

這個(gè)正則表達(dá)式匹配電話號(hào)碼如“(314)555-4000”的形式,你認(rèn)為這個(gè)正則表達(dá)式是否匹配“314-555-4000”或者“555- 4000”呢?答案是兩種都不匹配。寫(xiě)上這么一行代碼隱蔽了缺點(diǎn)和設(shè)計(jì)結(jié)果本身,電話區(qū)號(hào)是需要的,但是正則表達(dá)式在區(qū)號(hào)和前綴之間缺少一個(gè)分隔符號(hào)的說(shuō)明。

把這一行代碼分成幾行并加上注釋將把缺點(diǎn)暴露無(wú)疑,修改起來(lái)顯然更容易一些。

在Perl語(yǔ)言里面應(yīng)該是如下形式:

/

\(? # 可選圓括號(hào)

\d{3} # 必須的電話區(qū)號(hào)

\)? # 可選圓括號(hào)

[-\s.]? # 分隔符號(hào)可以是破折號(hào)、空格或者句點(diǎn)

\d{3} # 三位數(shù)前綴

[-.] # 另一個(gè)分隔符號(hào)

\d{4} # 四位數(shù)電話號(hào)碼

/x

改寫(xiě)過(guò)的正則表達(dá)式現(xiàn)在在電話區(qū)號(hào)后有一個(gè)可選擇的分隔符號(hào),這樣它應(yīng)該是匹配“314-555-4000”的,然而電話區(qū)號(hào)還是必須的。另一個(gè)程序員如果需要把電話區(qū)號(hào)變?yōu)榭蛇x項(xiàng)則可以迅速看出它現(xiàn)在不是可選的,一個(gè)小小的改動(dòng)就可以解決這個(gè)問(wèn)題。

二、書(shū)寫(xiě)測(cè)試

一共有三個(gè)層次的測(cè)試,每一層為你的代碼加上一層可靠性。首先,你需要認(rèn)真想想你需要匹配什么代碼以及你是否能夠處理錯(cuò)誤匹配。其次,你需要利用數(shù)據(jù)實(shí)例來(lái)測(cè)試正則表達(dá)式。最后,你需要正式通過(guò)一個(gè)測(cè)試小組的測(cè)試。

決定匹配什么其實(shí)就是在匹配錯(cuò)誤結(jié)果和錯(cuò)過(guò)正確結(jié)果之間尋求一個(gè)平衡點(diǎn)。如果你的正則表達(dá)式過(guò)于嚴(yán)格,它將會(huì)錯(cuò)過(guò)一些正確匹配;如果它過(guò)于寬松,它將會(huì)產(chǎn)生一個(gè)錯(cuò)誤匹配。一旦某個(gè)正則表達(dá)式發(fā)放到實(shí)際代碼當(dāng)中,你可能不會(huì)兩者都注意到�?紤]一下上面電話號(hào)碼的例子,它將會(huì)匹配“800-555-4000 = -5355”。錯(cuò)誤的匹配其實(shí)很難發(fā)現(xiàn),所以提前規(guī)劃做好測(cè)試是很重要的。

還是使用電話號(hào)碼的例子,如果你在Web表單里面確認(rèn)一個(gè)電話號(hào)碼,你可能只要滿足于任何格式的十位數(shù)字。但是,如果你想從大量文本里面分離電話號(hào)碼,你可能需要很認(rèn)證的排除不符合要求的錯(cuò)誤匹配。

在考慮你想匹配的數(shù)據(jù)的時(shí)候,寫(xiě)下一些案例情況。針對(duì)案例情況寫(xiě)下一些代碼來(lái)測(cè)試你的正則表達(dá)式。任何復(fù)雜的正則表達(dá)式都最好寫(xiě)個(gè)小程序測(cè)試一下,可以采用下面的具體形式。

在Perl語(yǔ)言里面:

#!/usr/bin/perl

my @tests = ( "314-555-4000",

"800-555-4400",

"(314)555-4000",

"314.555.4000",

"555-4000",

"aasdklfjklas",

"1234-123-12345"

);

foreach my $test (@tests) {

if ( $test =~ m/

\(? # 可選圓括號(hào)

\d{3} # 必須的電話區(qū)號(hào)

\)? # 可選圓括號(hào)

[-\s.]? # 分隔符號(hào)可以是破折號(hào)、空格或者句點(diǎn)

\d{3} # 三位數(shù)前綴

[-\s.] # 另一個(gè)分隔符號(hào)

\d{4} # 四位數(shù)電話號(hào)碼

/x ) {

print "Matched on $test\n";

}

else {

print "Failed match on $test\n";

}

}

在PHP語(yǔ)言里面:

 

$tests = array( "314-555-4000",

"800-555-4400",

"(314)555-4000",

"314.555.4000",

"555-4000",

"aasdklfjklas",

"1234-123-12345"

);

$regex = "/

\(? # 可選圓括號(hào)

\d{3} # 必須的電話區(qū)號(hào)

\)? # 可選圓括號(hào)

[-\s.]? # 分隔符號(hào)可以是破折號(hào)、空格或者句點(diǎn)

\d{3} # 三位數(shù)前綴

[-\s.] # 另一個(gè)分隔符號(hào)

\d{4} # 四位數(shù)電話號(hào)碼

/x";

foreach ($tests as $test) {

if (preg_match($regex, $test)) {

echo "Matched on $test
;";

}

else {

echo "Failed match on $test
;";

}

}

?>;

在Python語(yǔ)言里面:

import re

tests = ["314-555-4000",

"800-555-4400",

"(314)555-4000",

"314.555.4000",

"555-4000",

"aasdklfjklas",

"1234-123-12345"

]

pattern = r'''

\(? # 可選圓括號(hào)

\d{3} # 必須的電話區(qū)號(hào)

\)? # 可選圓括號(hào)

[-\s.]? # 分隔符號(hào)可以是破折號(hào)、空格或者句點(diǎn)

\d{3} # 三位數(shù)前綴

[-\s.] # 另一個(gè)分隔符號(hào)

\d{4} # 四位數(shù)電話號(hào)碼

'''

regex = re.compile( pattern, re.VERBOSE )

for test in tests:

if regex.match(test):

print "Matched on", test, "\n"

else:

print "Failed match on", test, "\n"

運(yùn)行測(cè)試代碼將會(huì)發(fā)現(xiàn)另一個(gè)問(wèn)題:它匹配“1234-123-12345”。

理論上,你需要整合整個(gè)程序所有的測(cè)試到一個(gè)測(cè)試小組里面。即使你現(xiàn)在還沒(méi)有測(cè)試小組,你的正則表達(dá)式測(cè)試也會(huì)是一個(gè)小組的良好基礎(chǔ),現(xiàn)在正是開(kāi)始創(chuàng)建的好機(jī)會(huì)。即使現(xiàn)在還不是創(chuàng)建的合適時(shí)間,你也應(yīng)該在每次修改以后運(yùn)行測(cè)試一下正則表達(dá)式。這里花費(fèi)一小段時(shí)間將會(huì)減少你很多麻煩事。

分享:解析PHP編碼規(guī)范之注釋和文件結(jié)構(gòu)
文件結(jié)構(gòu) | |――images |――include |――parameter |――config |――function |――index images存放圖片文件,include中是系統(tǒng)是要引用的文件,一般在parameter中存放參數(shù)文件,config中存放配置文件,function中存放方法文件,如javascript的方法等,

共2頁(yè)上一頁(yè)12下一頁(yè)
來(lái)源:模板無(wú)憂//所屬分類(lèi):PHP教程/更新時(shí)間:2009-06-11
相關(guān)PHP教程