學(xué)習(xí)動態(tài)網(wǎng)頁制作PHP技術(shù)的正則表達(dá)式(2)_PHP教程
推薦:單元測試對PHP代碼的檢查測試驅(qū)動的開發(fā)和單元測試是確保代碼在經(jīng)過修改和重大調(diào)整之后依然能如我們期望的一樣工作的最新方法。在本文中,您將學(xué)習(xí)到如何在模塊、數(shù)據(jù)庫和用戶界面(UI)層對自己的 PHP 代碼進(jìn)行單元測試。 現(xiàn)在是凌晨 3 點。我們怎樣才能知道自己的代碼依然在工作呢?
三、為交替操作分組
交替操作符號(|)的優(yōu)先級很低,這意味著它經(jīng)常交替超過程序員所設(shè)計的那樣。比如,從文本里面抽取Email地址的正則表達(dá)式可能如下:
^CC:|To:(.*)
上面的嘗試是不正確的,但是這個bug往往不被注意。上面代碼的意圖是找到“CC:”或者“To:”開始的文本,然后在這一行的后面部分提取Email地址。
不幸的是,如果某一行中間出現(xiàn)“To:”,那么這個正則表達(dá)式將捕獲不到任何以“CC:”開始的一行,而是抽取幾個隨機(jī)的文本。坦白的說,正則表達(dá)式匹配 “CC:”開始的一行,但是什么都捕獲不到;或者匹配任何包含“To:”的一行,但是把這行的剩余文本都捕獲了。通常情況下,這個正則表達(dá)式會捕獲大量 Email地址,所有沒有人會注意這個bug。
如果要符合實際意圖,那么你應(yīng)該加入括號說明清楚,正則表達(dá)式如下:
(^CC:)|(To:(.*))
如果真正意圖是捕獲以“CC:”或者“To:”開始的文本行的剩余部分,那么正確的正則表達(dá)式如下:
^(CC:|To:)(.*)
這是一個普遍的不完全匹配的bug,如果你養(yǎng)成為交替操作分組的習(xí)慣,你就會避免這個錯誤。
四、使用寬松數(shù)量詞
很多程序員避免使用寬松數(shù)量詞比如“*?”、“ ?”和“??”,即使它們會使這個表達(dá)式易于書寫和理解。
寬松數(shù)量詞可以盡可能少的匹配文本,這樣有助于完全匹配的成功。如果你寫了“foo(.*?)bar”,那么數(shù)量詞將在第一次遇到“bar”時就停止匹配,而不是在最后一次。如果你希望從“foo###bar bar”中捕獲“###”,這一點就很重要。一個嚴(yán)格數(shù)量詞將捕獲“###bar ”。
假設(shè)你要從HTML文件里面捕獲所有電話號碼,你可能會使用我們上文討論過的電話號碼正則表達(dá)式的例子。但是,如果你知道所有電話號碼都在一個表格的第一列里面,你可以使用寬松數(shù)量詞寫出更簡單的正則表達(dá)式:
很多剛起步的程序員不使用寬松數(shù)量詞來否定特定種類。他們能寫出下面的代碼:
這種情況下它可以正常運行,但是如果你想捕獲的文本包含有你分隔的公共字符(這種情況下比如;),這將會帶來很大麻煩。如果你使用了寬松數(shù)量詞,你只要花上很少的時間組裝字符種類就能產(chǎn)生新的正則表達(dá)式。
在你知道你要捕獲文本的環(huán)境結(jié)構(gòu)時,寬松數(shù)量詞是具有很大價值的。
五、利用可用分界符
Perl 和PHP語言常常使用左斜線(/)來標(biāo)志一個正則表達(dá)式的開頭和結(jié)尾,Python語言使用一組引號來標(biāo)志開頭和結(jié)尾。如果在Perl和PHP中堅持使用左斜線,你將要避免表達(dá)式中的任何斜線;如果在Python中使用引號,你將要避免使用反斜線(\)。選擇不同的分界符或引號可以允許你避免一半的正則表達(dá)式。這將使得表達(dá)式易于閱讀,減少由于忘記避免符號而潛在的bug。
Perl和PHP語言允許使用任何非數(shù)字和空格字符作為分界符。如果你切換到一個新的分界符,在匹配URL或HTML標(biāo)志(如“http://”或“
;”)時,你就可以避免漏掉左斜線了。
例如,“/http:\/\/(\S)*/”可以寫為“#http://(\S)*#”。
通用分界符是“#”、“!”和“|”。如果你要使用方括號、尖括號或者花括號,只要保持前后配對出現(xiàn)就可以了。下面就是一些通用分界符的示例:
#…# !…! {…} s|…|…| (Perl only) s[…][…] (Perl only) s<…>;/…/ (Perl only)
在Python中,正則表達(dá)式首先會被當(dāng)作一個字符串。如果你使用引號作為分界符,你將漏掉所有反斜線。但是你可以使用“r''”字符串避免這個問題。如果針對“re.VERBOSE”選項使用三個連續(xù)單引號,它將允許你包含換行。例如 regex = "(file://w )(//d )"可以寫出下面的形式:
regex = r'''
(\w )
(\d )
'''
小結(jié)
本文的建議主要著眼于正則表達(dá)式的可讀性,在開發(fā)中養(yǎng)成這些習(xí)慣,你將會更加清晰的考慮設(shè)計和表達(dá)式的結(jié)構(gòu),這將有助于減少bug和代碼的維護(hù),如果你自己就是這個代碼的維護(hù)者你將倍感輕松。
分享:解析PHP編碼規(guī)范之注釋和文件結(jié)構(gòu)文件結(jié)構(gòu) | |――images |――include |――parameter |――config |――function |――index images存放圖片文件,include中是系統(tǒng)是要引用的文件,一般在parameter中存放參數(shù)文件,config中存放配置文件,function中存放方法文件,如javascript的方法等,
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索學(xué)習(xí)動態(tài)網(wǎng)頁制作PHP技術(shù)的正則表達(dá)式(2)
- 教程說明:
PHP教程-學(xué)習(xí)動態(tài)網(wǎng)頁制作PHP技術(shù)的正則表達(dá)式(2)
。