正則表達式用于字符串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。將一些常用的表達式收藏在這里,作備忘之用。
匹配中文字符的正則表達式: [\u4e00-\u9fa5]
匹配雙字節字符(包括漢字在內):[^\x00-\xff]
應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正則表達式:\n[\s| ]*\r
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正則表達式:(^\s*)|(\s*$)
應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正則表達式分解和轉換IP地址:
下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:
function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g//匹配IP地址的正則表達式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正則表達式去除字串中重復的字符的算法程序:[注:此程序不正確,原因見本貼回復]
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+]","g")
var s2=s.replace(re,"")
alert(s1+s2)//結果為:abcefgi
我原來在CSDN上發貼尋求一個表達式來實現去除重復字符的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用后向引用取出包括重復的字符,再以重復的字符建立第二個表達式,取到不重復的字符,兩者串連。這個方法對于字符順序有要求的字符串可能不適用。
得用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1
s="s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正則表達式限制網頁表單里的文本框輸入內容:
用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\u4E00-\u9FA5]/g,’’))"
用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\uFF00-\uFFFF]/g,’’))"
用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^\d]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"
用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[\W]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"
正則表達式 regular expression
正則表達式 RegExp
模式 pattern
匹配 Match
.NET命名空間: System.Text.RegularExpression
補充:
^\d+$ //匹配非負整數(正整數 + 0)
^[0-9]*[1-9][0-9]*$ //匹配正整數
^((-\d+)|(0+))$ //匹配非正整數(負整數 + 0)
^-[0-9]*[1-9][0-9]*$ //匹配負整數
^-?\d+$ //匹配整數
^\d+(\.\d+)?$ //匹配非負浮點數(正浮點數 + 0)
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮點數
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ //匹配非正浮點數(負浮點數 + 0)
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配負浮點數
^(-?\d+)(\.\d+)?$ //匹配浮點數
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^\w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //匹配email地址
^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ //匹配url
利用正則表達式去除字串中重復的字符的算法程序:
var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+]","g")
var s2=s.replace(re,"")
alert(s1+s2) //結果為:abcefgi
===============================
如果var s = "abacabefggeeii"
結果就不對了,結果為:abeicfgg
正則表達式的能力有限
RE: totoro
謝謝你的指點,這個javascript正則表達式程序算法確實有問題,我會試著找更好的辦法!!!
1.確認有效電子郵件格式
下面的代碼示例使用靜態 Regex.IsMatch 方法驗證一個字符串是否為有效電子郵件格式。如果字符串包含一個有效的電子郵件地址,則 IsValidEmail 方法返回 true,否則返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在應用程序將地址存儲在數據庫中或顯示在 ASP.NET 頁中之前,篩選出包含無效字符的電子郵件地址。
[Visual Basic]
Function IsValidEmail(strIn As String) As Boolean
’ Return true if strIn is in valid e-mail format.
Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")
End Function
[C#]
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
2.清理輸入字符串
下面的代碼示例使用靜態 Regex.Replace 方法從字符串中抽出無效字符。您可以使用這里定義的 CleanInput 方法,清除掉在接受用戶輸入的窗體的文本字段中輸入的可能有害的字符。CleanInput 在清除掉除 @、-(連字符)和 .(句點)以外的所有非字母數字字符后返回一個字符串。
[Visual Basic]
Function CleanInput(strIn As String) As String
’ Replace invalid characters with empty strings.
Return Regex.Replace(strIn, "[^\w\.@-]", "")
End Function
[C#]
String CleanInput(string strIn)
{
// Replace invalid characters with empty strings.
return Regex.Replace(strIn, @"[^\w\.@-]", "");
}
3.更改日期格式
以下代碼示例使用 Regex.Replace 方法來用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。
[Visual Basic]
Function MDYToDMY(input As String) As String
Return Regex.Replace(input, _
"\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b", _
"${day}-${month}-${year}")
End Function
[C#]
String MDYToDMY(String input)
{
return Regex.Replace(input,
"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b",
"${day}-${month}-${year}");
}
Regex 替換模式
本示例說明如何在 Regex.Replace 的替換模式中使用命名的反向引用。其中,替換表達式 ${day} 插入由 (?<day>...) 組捕獲的子字符串。
有幾種靜態函數使您可以在使用正則表達式操作時無需創建顯式正則表達式對象,而 Regex.Replace 函數正是其中之一。如果您不想保留編譯的正則表達式,這將給您帶來方便
4.提取 URL 信息
以下代碼示例使用 Match.Result 來從 URL 提取協議和端口號。例如,“http://www.contoso.com:8080/letters/readme.html”將返回“http:8080”。
[Visual Basic]
Function Extension(url As String) As String
Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _
RegexOptions.Compiled)
Return r.Match(url).Result("${proto}${port}")
End Function
[C#]
String Extension(String url)
{
Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
RegexOptions.Compiled);
return r.Match(url).Result("${proto}${port}");
}
如何用正則表達式表示要么是數字要么是字母 是字母的話只能是一個字母 數字則無所謂?
^[a-zA-Z]$|^\d+$
我要回復
斷弦 2007-5-9 17:14:00 刪除 JavaScript中的正則表達式解析
2005-10-20 16:30:46
正則表達式(regular expression)對象包含一個正則表達式模式(pattern)。它具有用正則表達式模式去匹配或代替一個字符串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。 要為一個單獨的正則表達式添加屬性,可以使用正則表達式構造函數(constructor function),無論何時被調用的預設置的正則表達式擁有靜態的屬性(the predefined RegExp object has static properties that are set whenever any regular expression is used, 我不知道我翻得對不對,將原文列出,請自行翻譯)。
創建:
一個文本格式或正則表達式構造函數
文本格式: /pattern/flags
正則表達式構造函數: new RegExp("pattern"[,"flags"]);
參數說明:
pattern -- 一個正則表達式文本
flags -- 如果存在,將是以下值:
g: 全局匹配
i: 忽略大小寫
gi: 以上組合
[注意] 文本格式的參數不用引號,而在用構造函數時的參數需要引號。如:/ab+c/i new RegExp("ab+c","i")是實現一樣的功能。
在構造函數中,一些特殊字符需要進行轉意(在特殊字符前加"\")。如:re = new RegExp("\\w+")
正則表達式中的特殊字符
字符 含意
\ 做為轉意,即通常在"\"后面的字符不按原來意義解釋,如/b/匹配字符"b",當b前面加了反斜桿后/\b/,轉意為匹配一個單詞的邊界。
-或-
對正則表達式功能字符的還原,如"*"匹配它前面元字符0次或多次,/a*/將匹配a,aa,aaa,加了"\"后,/a\*/將只匹配"a*"。
^ 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"
$ 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/將匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba*/將匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba*/將匹配b,ba
(x) 匹配x保存x在名為$1...$9的變量中
x|y 匹配x或y
{n} 精確匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字符集(character set),匹配這個集合中的任一一個字符(或元字符)
[^xyz] 不匹配這個集合中的任何一個字符
[\b] 匹配一個退格符
\b 匹配一個單詞的邊界
\B 匹配一個單詞的非邊界
\cX 這兒,X是一個控制符,/\cM/匹配Ctrl-M
\d 匹配一個字數字符,/\d/ = /[0-9]/
\D 匹配一個非字數字符,/\D/ = /[^0-9]/
\n 匹配一個換行符
\r 匹配一個回車符
\s 匹配一個空白字符,包括\n,\r,\f,\t,\v等
\S 匹配一個非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一個制表符
\v 匹配一個重直制表符
\w 匹配一個可以組成單詞的字符(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一個不可以組成單詞的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
說了這么多了,我們來看一些正則表達式的實際應用的例子:
E-mail地址驗證:
function test_email(strEmail) {
var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
if(myReg.test(strEmail)) return true;
return false;
}
HTML代碼的屏蔽
function mask_HTMLCode(strInput) {
var myReg = /<(\w+)>/;
return strInput.replace(myReg, "<$1>");
}
正則表達式對象的屬性及方法
預定義的正則表達式擁有有以下靜態屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。
其中input和multiline可以預設置。其他屬性的值在執行過exec或test方法后被根據不同條件賦以不同的值。
許多屬性同時擁有長和短(perl風格)的兩個名字,并且,這兩個名字指向同一個值。(JavaScript模擬perl的正則表達式)
正則表達式對象的屬性 屬性 含義
$1...$9 如果它(們)存在,是匹配到的子串
$_ 參見input
$* 參見multiline
$& 參見lastMatch
$+ 參見lastParen
$` 參見leftContext
$’ 參見rightContext
constructor 創建一個對象的一個特殊的函數原型
global 是否在整個串中匹配(bool型)
ignoreCase 匹配時是否忽略大小寫(bool型)
input 被匹配的串
lastIndex 最后一次匹配的索引
lastParen 最后一個括號括起來的子串
leftContext 最近一次匹配以左的子串
multiline 是否進行多行匹配(bool型)
prototype 允許附加屬性給對象
rightContext 最近一次匹配以右的子串
source 正則表達式模式
lastIndex 最后一次匹配的索引
正則表達式對象的方法
方法 含義
compile 正則表達式比較
exec 執行查找
test 進行匹配
toSource 返回特定對象的定義(literal representing),其值可用來創建一個新的對象。重載Object.toSource方法得到的。
toString 返回特定對象的串。重載Object.toString方法得到的。
valueOf 返回特定對象的原始值。重載Object.valueOf方法得到
例子
Smith, John
將輸出"Smith, John"
posted by yxs
斷弦 2007-5-9 17:15:00 刪除 《正則表達式在UBB論壇中的應用》
一、讀者指引
讀者指引幫助你掌握本文的梗概。以免你看了大半才明白這編文章不適合你,給你造成視覺污染。
如果你正在用ASP寫程序,或者你正在寫一些諸如BBS、留言溥或表單數據檢查之類的東東那就值得一看。
如果你對正則表達式已經了如指掌,那么你不必一行行的看,只要看看我寫的模板,再比較一下,取其精華就行了。
如果你還是第一次接觸正則表達式,那么你最好一行行的看,并逐條試驗
當你熟練的掌握了正則表達式的用法,你就會發現其樂無窮。
二、正則表達式的概念
什么是UBB代碼?什么是正則表達式?
UBB代碼是HTML的一個變種。一般情況下,UBB論壇不允許你使用HTML代碼,而只能用UBB代碼替代HTML代碼。
UBB代碼是一套由流行的UBB標簽組成了固定代碼,代碼有統一的格式。用戶只要遵循代碼規則就可以實現用戶想要的功能。如:
想要顯示粗體的how are you 字樣,就應該輸入 how are you而不是輸入<b>how are you</b>
你也許會問:ASP是怎樣把 how are you轉換為<b>how are you</b>的呢?
回答這個問題就是:用正則表達式。
三、正則表達式的用途
有時我們在制作網站表單數據處理的時候(尤其是UBB論壇),都需要進行數據驗證和字符串替代,特別是UBB論壇要進行大量的數據安全性和字符串替代
郵于一般的論壇不支持HTML語法這就使得用戶不能修改字體,不能貼圖等等一些功能。這樣使得論壇失去了吸引用戶的一個強有力的途徑。可能說一個強大的論壇在吸引用戶數量上還是很重要的。這樣就出現了一個UBB解決方案,即在論壇不支持HTML語法的情況下用戶仍然可以定制自已貼子的樣式,貼圖,增加鏈接,轉貼網頁等等諸多的功能,可能達到支持HTML語法同樣的效果,而且這樣可以使得論壇相對于HTML的論壇安全性大大提高。用戶基本不能對論壇過行任何惡意攻擊。
四、正則表達式的語法規則和標記
現在我們正式進入則表達式的學習,我會根據實例結合講解正則表達式的用法,看完后你就會覺得寫UBB代碼如此簡單了,只要你一步一步的跟著我學 看完本文章后你就成為UBB高手了。激動人心的就是你能寫出自已的UBB標簽來了,再也不用到別人那里去拷貝現成的代碼和模板了。 還好VBScritp5.0給我們提供了“正則表達式”對象,只要你的服務器安裝了IE5.x,就可以運行了.
字符描述:
^符號匹配字符串的開頭。例如:
^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次(n為非負整數)前面的字符。例如:
a{2} 可以匹配“aa“,但不匹配“a”
{n,}匹配至少n次(n為非負整數)前面的字符。例如:
a{3,} 匹配“aaa”、“aaaa”等,但不匹配“a”和“aa”。
注意:a{1,}等價于a+
a{0,}等價于a*
{m,n}匹配至少m個,至多n個前面的字符。例如:
a{1,3} 只匹配“a”、“aa”和“aaa”。
注意:a{0,1}等價于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)在字符串中精確查找鏈接地址
((http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3})(((\/[\~]*|\\[\~]*)
(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)
我們知道,鏈接地址一般以http或者https或者ftp等形式出現。初步總結一下就是,鏈接地址必須符合如下條件:
條件1
以http://或者https://或者ftp://等開頭(當然還有其它形式,這里只列出主要的)
條件2
http://后面必須跟一個單詞字符,緊接著單詞字符后面的是"."(這樣的組合必須出現一次或多次)。緊跟著“.”后面的是域名后綴(如net或者com或者cn等,如果是以IP地址的形式出現就可以是數字)
條件3
出現完整的鏈接地址后,還可以出現下一級或者更多級的目錄(還要注意個人主頁的地址有可能出現"~"符號)
條件4
鏈接地址末尾可以帶參數。如典型的頁數?PageNo=2&action=display等
現在我們用下面的代碼來逐個匹配上面的條件——
1、((http|https|ftp):(\/\/|\\\\) 滿足條件1
表示http:// http:\\ https:// https:\\ ftp:// ftp:\\都匹配(在這里考慮了某些用戶可能把"http://"輸成“\\”的易發性錯誤)
注意:"|"表示“或者”,"\"是轉義字符。“\/\/”表示"http://",“\\\\”表示"\\"
2、((\w)+[.]){1,}(net|com|cn|org|cc|tv|[0-9]{1,3}) 滿足條件2
“((\w)+[.]){1,}”表示一個單詞字符加一個點號可以出現1次或者多次(這里考慮了某些用戶喜歡省略www而將http://www.w3c.com寫成http://w3c.com)
“(net|com|cn|org|cc|tv|[0-9]{1,3})”表示必須要以net或者com或者cn或者org或者cc或者tv或者三位以下的數字結束
[0-9]{1,3}表示三位以下的數字,因為ip地址的任何段不能超過255
3、(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)* 滿足條件3
“(\/[\~]*|\\[\~]*)”表示可以出現"/~"或者是"\~",(其中“[\~]*”表示 ~ 可以出現也可以不出現),因為不是每個鏈接地址都有下一級目錄
“(\w)+)|[.](\w)+)”表示必須出現一個單詞字符(即目錄或者是一個帶有擴展名的文件)
注意:最后還有一個“*”表示上面括號內的可以出現也可以不出現,否則就只能匹配有下一級目錄的鏈接地址了。
4、(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)滿足條件4
“((([?](\w)+){1}[=]*))*((\w)+){1}”表示形如"?PageNo=2"的字符串可以出現也可以不出現,如果出現則只能出現一次(因為不可能有兩個“?”號出現)。
“([\&](\w)+[\=](\w)+)*)”表示形如“&action=display”的字符串可以出現也可以不出現(因為并不是每個網頁都帶有兩個以上的參數。
整個“((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*”表示形如“?PageNo=2&action=display”的字符串可以出現也可以不出現(即鏈接地址可以有參數也可以沒有參數)
把上面的組合起來,我們就可以匹配一個比較全面的鏈接地址了。比用簡單的“(http:\/\/\S+)”來匹配一個鏈接地址要好,讀者可以自行行測試比較。當然,這段代碼還有很多不足之處,希望大家能夠繼續改進。
2)替代典型的UBB標簽:[/b]
我們的目的就是要把[b]成對的替換成<b></b>下面來看我們實現它的模板
(\[b\])(.+)(\[\/b\])
這里用了"(.+)"來配匹到之間的整個字符串,在替代的時候我們要寫成這樣
str=checkexp(re,str,"<b>$2</b>")
(注意:checkexp是我自定義的函數,將在后面給出。這個函數將把[/b]按照我們提供的模板進行替代。)
也許你會問這里出現一個"$2"是什么東東,呵注意了這個$2可是很重要的,它代表了"(.+)"所配匹的整個字符串。
為什么是$2而不是$1、$3呢?因為$1代表(\[b\])所匹配的"[b]"字符串,$3代表(\[\/b\])所匹配的""字符串,顯然這里我們需要的是$2而不是$1$3。
六)UBB正則表達模板實例
下面是我寫的一個UBB函數,這個函數基本上能使你的論壇成為一個優秀的UBB代碼論壇了。當然,通過改進后,你可以得到一個更強大的UBB論壇。
Function ReThestr(face,str)
dim re,str
re="\>"
str=checkexp(re,str,">")
re="\<"
str=checkexp(re,str,"<")
re="\n\r\n/"
str=checkexp(re,str,"<P>")
re=chr(32)
str=checkexp(re,str," ")
re="\r"
str=checkexp(re,str," ")
re="\[img\]((http:(\/\/|\\\\)){1}((\w)+[.]){1,3}(net|com|cn|org|cc|tv)(((\/[\~]*|\\[\~]*)
(\w)+)|[.](\w)+)*(\w)+[.]{1}(gif|jpg|png))\[\/img\]" ’查找圖片地址
str=checkexp(re,str," <img src=’$1’> ")
re="\[w\](http:(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv)(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*
(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)\[\/w\]" ’查找幀地址
str=checkexp(re,str,"<iframe width=’300’ height=’300’ src=’$1’></iframe>")
re="([^(’>)])(<br>)*((http|https|ftp):(\/\/|\\\\)((\w)+[.]){1,}(net|com|cn|org|cc|tv|([0-9]{1,3}))(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)" ’查找鏈接地址
str=checkexp(re,str,"$1$2 <a href=’$3’ target=_blank>$3</a> ")
re="([^(http://|http:\\)])((www|cn)[.](\w)+[.]{1,}(net|com|cn|org|cc)(((\/[\~]*|\\[\~]*)(\w)+)|[.](\w)+)*
(((([?](\w)+){1}[=]*))*((\w)+){1}([\&](\w)+[\=](\w)+)*)*)" ’查找不以http://開頭的地址
str=checkexp(re,str,"$1 <a href=’http://$2’ target=_blank>$2</a> ")
re="([^(=)])((\w)+[@]{1}((\w)+[.]){1,3}(\w)+)" ’查找郵件地址
str=checkexp(re,str," <a href=’mailto:$2’>$2</a> ")
re="\[0-F]{6})\]((.)+)\[\/color\]" ’替換字體色彩
str=checkexp(re,str,"<font color=’$1’>$4</font>")
re="\[size=([0-9]{1})\]((.)+)\[\/size\]" ’替換字體大小
str=checkexp(re,str,"<font size=’$1’>$2</font>")
re="\((.)+)\[\/font\]" ’替換字體
str=checkexp(re,str,"<font face=’$1’>$3</font>")
re="(\[b\])(.+)(\[\/b\])" ’加粗字體
str=checkexp(re,str,"<b>$2</b>")
re="(\[u\])(.+)(\[\/u\])" ’下畫線
str=checkexp(re,str,"<u>$2</u>")
re="(\[li\])(.+)(\[\/li\])" ’列表
str=checkexp(re,str,"<li>$2</li>")
re="(\[QUOTE\])(.+)(\[\/QUOTE\])" ’引用
str=checkexp(re,str,"<BLOCKQUOTE>引用:<HR SIZE=1>$2<HR SIZE=1></BLOCKQUOTE>")
re="\[email=((\w)+[@]{1}((\w)+[.]){1,3}(\w)+)\](.+)(\[\/email\])" ’郵件
str=checkexp(re,str,"<a href=mailto:$1>$6</a>")
re="(\[center\])(.+)(\[\/center\])" ’居中
str=checkexp(re,str,"<center>$2</center>")
re="fuck"
str=checkexp(re,str,"***")
re="操"
str=checkexp(re,str,"***")
re="sex"
str=checkexp(re,str,"***")
re="TMD"
str=checkexp(re,str,"***")
re="shit"
str=checkexp(re,str,"***")
ReThestr=str
end function
UBB代碼如下:
[i] [/i] [u] [/u]
[url] [/url] [email=] [/email] [img] [/img]
引用:
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
[li] [/li] [font=impact] [color=Yellow]
測試代碼如下:
[img] [/img]http://cn.yahoo.com
aol.com 192.168.0.1
www.yahoo.com how are you[/b]
page2000.xiloo.com/~page2000?PageNo=2&action=del
lucaihui@cmmail.com 大家好http:\\page2000.shit
<font color=red>http://test.com</font>http://test
全部符合預想結果
七)ASP正則表達式對像函數如下:
Function CheckExp(patrn,strng,tagstr)
Dim regEx,Matches
Set regEx=New RegExp’建立一個新對像
regEx.Pattern=patrn’設置模板
regEx.IgnoreCase=true’搜索是否區分大小寫的 true表是不區分 flase表示區分
regEx.Global=True’搜索是否應用于整個字符串
Matches=regEx.replace(strng,tagstr)’匹配并替代字符串
CheckExp=Matches返回函數結果
end function
把上面的兩個函數存為一個頁面(如ubbcode.asp),這樣就組成一個完整的UBB函數了。
在你的論壇上加上這個函數,就成了支持UBB代碼的論壇了。只要在用時調用這個函數就行了。調用形式如
text=ReThestr(text)
很久以前寫的文章了不知現在還實不實用
嘻~~有錯誤的話
問我我也不清楚了這么久不看都忘了
:)
倒這文章看不了了禁止笑臉轉換了還這樣
看來ubb和ubb沖突了
哈~~~~~