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