正規表示式的概念
什麼是ubb**?什麼是正規表示式?
ubb**是html的乙個變種。一般情況下,ubb論壇不允許你使用html**,而只能用ubb**替代html**。
ubb**是一套由流行的ubb標籤組成了固定**,**有統一的格式。使用者只要遵循**規則就可以實現使用者想要的功能。如:
想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入how are you
你也許會問:asp是怎樣把 how are you轉換為how are you的呢?
回答這個問題就是:用正規表示式。
三、正規表示式的用途
有時我們在製作**表單資料處理的時候,都需要進行資料驗證和字串替代,特別是ubb論壇要進行大量的資料安全性和字串替代
郵於一般的論壇不支援html語法這就使得使用者不能修改字型,不能貼圖等等一些功能。這樣使得論壇失去了吸引使用者的乙個強有力的途徑。可能說乙個強大的論壇在吸引使用者數量上還是很重要的。這樣就出現了乙個ubb解決方案,即在論壇不支援html語法的情況下使用者仍然可以定製自已貼子的樣式,貼圖,增加鏈結,轉貼網頁等等諸多的功能,可能達到支援html語法同樣的效果,而且這樣可以使得論壇相對於html的論壇安全性大大提高。使用者基本不能對論壇過行任何惡意攻擊。
四、正規表示式的語法規則和標記
字元描述:
^符號匹配字串的開頭。例如:
^abc 與「abc xyz」匹配,而不與「xyz abc」匹配
$符號匹配字串的結尾。例如:
abc$ 與「xyz abc」匹配,而不與「abc xyz」匹配。
注意:如果同時使用^符號和$符號,將進行精確匹配。例如:
^abc$ 只與「abc」匹配
*符號匹配0個或多個前面的字元。例如:
ab* 可以匹配「ab」、「abb」、「abbb」等
+符號匹配至少乙個前面的字元。例如:
ab+ 可以匹配「abb」、「abbb」等,但不匹配「ab」。
?符號匹配0個或1個前面的字元。例如:
ab?c? 可以且只能匹配「abc」、「abbc」、「abcc」和「abbcc」
.符號匹配除換行符以外的任何字元。例如:
(.)+ 匹配除換行符以外的所有字串
x|y匹配「x」或「y」。例如:
abc|xyz 可匹配 「abc」或 「xyz」,而「ab(c|x)yz」匹配 「abcyz」和「abxyz」
匹配恰好n次(n為非負整數)前面的字元。例如:
a 可以匹配「aa「,但不匹配「a」
匹配至少n次(n為非負整數)前面的字元。例如:
a 匹配「aaa」、「aaaa」等,但不匹配「a」和「aa」。
注意:a等價於a+
a等價於a*
匹配至少m個,至多n個前面的字元。例如:
a 只匹配「a」、「aa」和「aaa」。
注意:a等價於a?
[xyz]表示乙個字符集,匹配括號中字元的其中之一。例如:
[abc] 匹配「a」、「b」和「c」
[^xyz]表示乙個否定的字符集。匹配不在此括號中的任何字元。例如:
[^abc] 可以匹配除「a」、「b」和「c」之外的任何字元
[a-z]表示某個範圍內的字元,匹配指定區間內的任何字元。例如:
[a-z] 匹配從「a」到「z」之間的任何乙個小寫字母字元
[^m-n]表示某個範圍之外的字元,匹配不在指定範圍內的字元。例如:
[m-n] 匹配除從「m」到「n」之間的任何字元
/符號是轉義操作符。例如:
/n 換行符
/f 分頁符
/r 回車
/t 製表符
/v 垂直製表符
// 匹配「/」
// 匹配「/」
/s 任何白字元,包括空格、製表符、分頁符等。等價於「[ /f/n/r/t/v]」
/s 任何非空白的字元。等價於「^/f/n/r/t/v]」
/w 任何單詞字元,包括字母和下劃線。等價於「[a-za-z0-9_]」
/w 任何非單詞字元。等價於「[^a-za-z0-9_]」
/b匹配單詞的結尾。例如:
ve/b 匹配單詞「love」等,但不匹配「very」、「even」等
/b匹配單詞的開頭。例如:
ve/b 匹配單詞「very」等,但不匹配「love」等
/d匹配乙個數字字元,等價於[0-9]。例如:
abc/dxyz 匹配「abc2xyz」、「abc4xyz」等,但不匹配「abcaxyz」、「abc-xyz」等
/d匹配乙個非數字字元,等價於[^0-9]。例如:
abc/dxyz 匹配「abcaxyz」、「abc-xyz」等,但不匹配「abc2xyz」、「abc4xyz」等
/num匹配num個(其中num為乙個正整數),引用回到記住的匹配。例如:
(.)/1 匹配兩個連續相同的字元。
/onum匹配n(其中n為乙個小於256的八進位製換碼值)。例如:
/o011 匹配製表符
/xnum匹配num(其中num為乙個小於256的十六進製製換碼值)。例如:
/x41 匹配字元「a」
五、例項分析
1)在字串中精確查詢鏈結位址
條件1以http://或者https://或者ftp://等開頭(當然還有其它形式,這裡只列出主要的)
條件2http://後面必須跟乙個單詞字元,緊接著單詞字元後面的是"."(這樣的組合必須出現一次或多次)。緊跟著「.」後面的是網域名稱字尾(如net或者com或者cn等,如果是以ip位址的形式出現就可以是數字)
條件3條件4
鏈結位址末尾可以帶引數。如典型的頁數?pageno=2&action=display等
現在我們用下面的**來逐個匹配上面的條件——
1、((http|https|ftp)|) 滿足條件1
表示http:// http:// https:// https:// ftp:// ftp://都匹配(在這裡考慮了某些使用者可能把"//"輸成「//」的易發性錯誤)
注意:"|"表示「或者」,"/"是轉義字元。「」表示"//",「」表示"//"
2、((/w)+[.])(net|com|cn|org|cc|tv|[0-9]) 滿足條件2
「((/w)+[.])」表示乙個單詞字元加乙個點號可以出現1次或者多次(這裡考慮了某些使用者喜歡省略www而將
http://www.w3c.com寫成
「(net|com|cn|org|cc|tv|[0-9])」表示必須要以net或者com或者cn或者org或者cc或者tv或者三位以下的數字結束
[0-9]表示三位以下的數字,因為ip位址的任何段不能超過255
3、(((//[/~]*|//[/~]*)(/w)+)|[.](/w)+)* 滿足條件3
「(/w)+)|[.](/w)+)」表示必須出現乙個單詞字元(即目錄或者是乙個帶有副檔名的檔案)
4、(((([?](/w)+)[=]*))*((/w)+)([/&](/w)+[/=](/w)+)*)*)滿足條件4
「((([?](/w)+)[=]*))*((/w)+)」表示形如"?pageno=2"的字串可以出現也可以不出現,如果出現則只能出現一次(因為不可能有兩個「?」號出現)。
「([/&](/w)+[/=](/w)+)*)」表示形如「&action=display」的字串可以出現也可以不出現(因為並不是每個網頁都帶有兩個以上的引數。
整個「((([?](/w)+)[=]*))*((/w)+)([/&](/w)+[/=](/w)+)*)*」表示形如「?pageno=2&action=display」的字串可以出現也可以不出現(即鏈結位址可以有引數也可以沒有引數)
把上面的組合起來,我們就可以匹配乙個比較全面的鏈結位址了。比用簡單的「(http:/s+)」來匹配乙個鏈結位址要好,讀者可以自行行測試比較。當然,這段**還有很多不足之處,希望大家能夠繼續改進。
2)替代典型的ubb標籤:
我們的目的就是要把成對的替換成下面來看我們實現它的模板
(/[b/])(.+)(/[//b/])
這裡用了"(.+)"來配匹到之間的整個字串,在替代的時候我們要寫成這樣
str=checkexp(re,str,"$2"
(注意:checkexp是我自定義的函式,將在後面給出。這個函式將把按照我們提供的模板進行替代。)
也許你會問這裡出現乙個"$2"是什麼東東,呵注意了這個$2可是很重要的,它代表了"(.+)"所配匹的整個字串。
為什麼是$2而不是$1、$3呢?因為$1代表(/[b/])所匹配的""字串,$3代表(/[//b/])所匹配的""字串,顯然這裡我們需要的是$2而不是$1$3。
正規表示式用法
乙個正規表示式就是由普通字元 例如字元 a 到 z 以及特殊字元 稱為元字元 組成的文字模式。該模式描述在查詢文字主體時待匹配的乙個或多個字串。正規表示式作為乙個模板,將某個字元模式與所搜尋的字串進行匹配。將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 後向引用 或乙個八進位制轉義符。例如,...
正規表示式用法
1 正規表示式 理解 1 就是符合一定規則的字串 2 常見規則 a 字元 x 字元 x。舉例 a 表示字元a 反斜線字元。n 新行 換行 符 u000a r 回車符 u000d b 字元類 abc a b 或 c 簡單類 abc 任何字元,除了 a b 或 c 否定 a za z a到 z 或 a到...
正規表示式用法
今天遇到乙個格式化字串輸入函式如下 char pcuserhdr abc username inte ce sscanf pcuserhdr,acusername,acinte ce 對此學習了下,輸出乙個總結 1.sscanf函式原型不多做解釋,直接以乙個例子開始 sscanf buf,get b...