經(jīng)典JavaScript正則表達(dá)式實(shí)戰(zhàn)(附pdf)
更新時間:2012年06月20日 19:07:25 作者:
本文不是使用Dreamweaver編輯,以下測試代碼可能已經(jīng)在賦值粘貼的過程做了一些調(diào)整,可能執(zhí)行失效。可以參看
關(guān)于測試代碼
本文不是使用Dreamweaver編輯,以下測試代碼可能已經(jīng)在賦值粘貼的過程做了一些調(diào)整,可能執(zhí)行失效??梢詤⒖幢疚牡膒df版本。
匹配結(jié)尾的數(shù)字
如
30CAC0040 取出40
3SFASDF92 取出92
正則如下:/\d+$/g
統(tǒng)一空格個數(shù)
字符串內(nèi)字符鍵有空格,但是空格的數(shù)量可能不一致,通過正則將空格的個數(shù)統(tǒng)一變?yōu)橐粋€。
例如:藍(lán) 色 理 想
變成:藍(lán) 色 理 想
aobert的正則:
<script type="text/javascript">
var str="藍(lán) 色 理 想"
var reg=/\s+/g
str = str.replace(reg," ")
document.write(str)
</script>
判斷字符串是不是由數(shù)字組成
來源:有沒有簡單的方法判斷字符串由數(shù)字組成?
這個正則比較簡單,寫了一個測試
<script type="text/javascript">
function isDigit(str){
var reg = /^\d*$/;
return reg.test(str);
}
var str = "7654321";
document.write(isDigit(str));
var str = "test";
document.write(isDigit(str));
</script>
電話號碼正則
:求一個驗(yàn)證電話號碼的JS正則
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/區(qū)號必填為3-4位的數(shù)字,區(qū)號之后用“-”與電話號碼連接
^\d{3,4}-電話號碼為7-8位的數(shù)字
\d{7,8}分機(jī)號碼為3-4位的數(shù)字,非必填,但若填寫則以“-”與電話號碼相連接
(-\d{3,4})?手機(jī)號碼正則表達(dá)式
正則驗(yàn)證手機(jī)號,忽略前面的0,支持130-139,150-159。忽略前面0之后判斷它是11位的。
cloeft的正則:
/^0*(13|15)\d{9}$/^0*匹配掉開頭任意數(shù)量的0。
腳本之家發(fā)布的手機(jī)號碼
function checkMobile(){
var sMobile = document.mobileform.mobile.value
if(!(/^1[3|4|5|8][0-9]\d{4,8}$/.test(sMobile))){
alert("不是完整的11位手機(jī)號或者正確的手機(jī)號前七位");
document.mobileform.mobile.focus();
return false;
}
}
由于手機(jī)號碼是13任意數(shù)字9位,和15任意數(shù)字9位,所以可以用(13|15)\d{9}匹配。
測試代碼如下:
function testReg(reg,str){
return reg.test(str);
}
var reg =/^1[3|4|5|8][0-9]\d{4,8}$/;
var str = '13889294444';
var str2 = '12889293333';
var str3 = '23445567';
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
使用正則表達(dá)式實(shí)現(xiàn)刪除字符串中的空格:
來源:請問js中有沒有去掉空格的函數(shù)
代碼以及測試代碼如下:
<script type="text/javascript">
//刪除字符串兩側(cè)的空白字符。
function trim(str){
return str.replace(/^\s+|\s+$/g,'');
}
//刪除字符串左側(cè)的空白字符。
function ltrim(str){
return str.replace(/^\s+/g,'');
}
//刪除字符串右側(cè)的空白字符。
function rtrim(str){
return str.replace(/\s+$/g,'');
}
//以下為測試代碼
var trimTest = " 123456789 ";
//前后各有一個空格。
document.write('length:'+trimTest.length+'<br />');
//使用前
document.write('ltrim length:'+ltrim(trimTest).length+'<br />');
//使用ltrim后
document.write('rtrim length:'+rtrim(trimTest).length+'<br />');
//使用rtrim后
document.write('trim length:'+trim(trimTest).length+'<br />');
//使用trim后
</script>
測試的結(jié)果如下:
length:11
ltrim length:10
rtrim length:10
trim length:9限制文本框只能輸入數(shù)字和小數(shù)點(diǎn)等等
來源:文本框輸入限制的問題????
只能輸入數(shù)字和小數(shù)點(diǎn)
var reg = /^\d*\.?\d{0,2}$/開頭有若干個數(shù)字,中間有0個或者一個小數(shù)點(diǎn),結(jié)尾有0到2個數(shù)字。
只能輸入小寫的英文字母和小數(shù)點(diǎn),和冒號,正反斜杠(:./\)
var reg = /[a-z\.\/\\:]+/;a-z包括了小寫的英文字母,\.是小數(shù)點(diǎn),\/和\\分別是左右反斜線,最后是冒號。整個組成一個字符集和代碼任一均可,最后在加上+,1或者多個。
替換小數(shù)點(diǎn)前內(nèi)容為指定內(nèi)容
請問 怎么把這個字符串的小數(shù)點(diǎn)前面的字符替換為我自定義的字符串???
例如:infomarket.php?id=197 替換為 test.php?id=197
應(yīng)該可以把第一個點(diǎn)“.”之前的所有單詞字符替換為test就可以了。我寫的正則如下:
<script type="text/javascript">
var str = "infomarket.php?id=197";
var reg = /^\w*/ig;
//匹配字符串開頭的任意個單詞字符
str = str.replace(reg,'test');
document.write(str);
</script>
原帖的有點(diǎn)復(fù)雜,沒太看明白。
只匹配中文的正則表達(dá)式
前兩天看的《JavaScript開發(fā)王》里恰好有中文的unicode范圍,正則如下:
/[\u4E00-\u9FA5\uf900-\ufa2d]/寫了一個簡單的測試,會把所有的中文替換成“哦”。
<script type="text/javascript">
var str = "有中文?and English.";
var reg = /[\u4E00-\u9FA5\uf900-\ufa2d]/ig;
str = str.replace(reg,'哦');
document.write(str);
</script>
返回字符串的中文字符個數(shù)
一般的字符長度對中文和英文都是不分別的 如JS里的length,那么如何返回字符串中中文字符的個數(shù)呢?guoshuang老師在原帖中給出了解決方案,我又沒看懂……
不過我自己也想到了一個辦法:先去掉非中文字符,再返回length屬性。函數(shù)以及測試代碼如下:
<script type="text/javascript">
function cLength(str){
var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
//匹配非中文的正則表達(dá)式
var temp = str.replace(reg,'');
return temp.length;
}
var str = "中文123";
document.write(str.length+'<br />');
document.write(cLength(str));
</script>
結(jié)果:
5
2中文兩個,數(shù)字三個,正確。
下面的測試也正確。
var str = "中文123tets@#!#%$#[][{}";
document.write(str.length+'<br />');
document.write(cLength(str));
正則表達(dá)式取得匹配IP地址前三段
來源:如何用正則取IP前3段
192.168.118.101,192.168.118.72, 192.168.118.1都替換成:192.168.118
只要匹配掉最后一段并且替換為空字符串就行了,正則如下:
/\.\d{1,3}$/匹配結(jié)尾的.n,.nn或者.nnn。
測試代碼如下:
function replaceReg(reg,str){
return str.replace(reg,'')
}
var reg = /\.\d{1,3}$/;
var str = '192.168.118.101';
var str2 = '192.168.118.72';
var str3 = '192.168.118.1';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
相似的有,這個帖子里有一個驗(yàn)證IP地址的方法:求檢驗(yàn)MAC地址的正則表達(dá)例子
匹配<ul>與<ul>之間的內(nèi)容
<ul>safsf<ul>safsf</ul><ul>safsf</ul></ul>
用正則可以得到 <ul>起到下個<ul> 之間的內(nèi)容。
正則如下:
/<ul>[\s\S]+?<ul>/i
首先匹配兩側(cè)的ul標(biāo)簽,中間的[\s\S]+?可以匹配一個或者多個任意字符,一定要非貪婪,否則會匹配<ul>safsf<ul>safsf</ul><ul>。
用正則表達(dá)式獲得文件名
c:\images\tupian\006.jpg
可能是直接在盤符根目錄下,也可能在好幾層目錄下,要求替換到只剩文件名。
xlez的正則如下:
/[^\\\/]*[\\\/]+/g
首先匹配非左右斜線字符0或多個,然后是左右斜線一個或者多個。形如“xxx/”或者“xxx\”或者“/”或者“\”
函數(shù)以及測試代碼:
<script type="text/javascript">
function getFileName(str){
var reg = /[^\\\/]*[\\\/]+/g;
//xxx\或者是xxx/
str = str.replace(reg,'');
return str;
}
var str = "c:\\images\\tupian\\006.jpg";
document.write(getFileName(str)+'<br />');
var str2 = "c:/images/tupian/test2.jpg";
document.write(getFileName(str2));
</script>
注意,\需要轉(zhuǎn)義。
絕對路徑變相對路徑
來源:討論一個正則
將<IMG height="120" width="800" src="http://23.123.22.12/image/somepic.gif">轉(zhuǎn)換為:<IMG height="120" width="800" src="/image/somepic.gif">。
其中網(wǎng)址可能改變,例如http://localhost等等。
cloudchen的正則:
/http:\/\/[^\/]+/首先是http://,然后[^\/]+找過1個或者多個非/字符,因?yàn)橛龅降谝粋€/表示已經(jīng)到目錄了,停止匹配。
測試代碼如下:
<script type="text/javascript">
var str = '<IMG height="120" width="800" \
src="http://23.123.22.12/image/somepic.gif">';
var reg = /http:\/\/[^\/]+/;
str = str.replace(reg,"");
alert(str)
</script>
用戶名正則
用于用戶名注冊,,用戶名只 能用 中文、英文、數(shù)字、下劃線、4-16個字符。
hansir和解決方案弄成正則:
/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/
中文字符或者單詞字符,4到16個。實(shí)現(xiàn)4到16結(jié)成到正則里的關(guān)鍵就是開始^和結(jié)束$,這就等于整個字符串只能有這些匹配的內(nèi)容,不能有多余的。
函數(shù)和測試代碼如下:
<script type="text/javascript">
function isEmail(str){
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/;
return reg.test(str);
}
var str = '超級無敵用戶名regExp';
var str2 = '搗亂的@';
var str3 = '太短'
var str4 = '太長longlonglonglonglonglonglonglong'
document.write(isEmail(str)+'<br />');
document.write(isEmail(str2)+'<br />');
document.write(isEmail(str3)+'<br />');
document.write(isEmail(str4)+'<br />');
</script>
匹配英文地址
來源:-求助- 正則問題
規(guī)則如下:
包含 "點(diǎn)", "字母","空格","逗號","數(shù)字",但開頭和結(jié)尾不能是除字母外任何字符。
[\.a-zA-Z\s,0-9]這個字符集就實(shí)現(xiàn)了字母,空格,逗號和數(shù)字。最終正則如下:
/^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/
開頭必須有字母,結(jié)束也必須是一個以上字母。測試代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/;
var str = 'No.8,ChangAn Street,BeiJing,China';
var str2 = '8.No,ChangAn Street,BeiJing,China';
var str3 = 'No.8,ChangAn Street,BeiJing,China88';
document.write(testReg(reg,str)+'<br />')
document.write(testReg(reg,str2)+'<br />')
document.write(testReg(reg,str3)+'<br />')
</script>
正則匹配價格
價格的格式應(yīng)該如下:
開頭數(shù)字若干位,可能有一個小數(shù)點(diǎn),小數(shù)點(diǎn)后面可以有兩位數(shù)字。hansir給出的對應(yīng)正則如下:
/^(\d*\.\d{0,2}|\d+).*$/
hansir給出的測試代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標(biāo)題文檔</title>
<script type="text/javascript">
function checkPrice(me){
if(!(/^(?:\d+|\d+\.\d{0,2})$/.test(me.value))){
me.value = me.value.replace(/^(\d*\.\d{0,2}|\d+).*$/,'$1');
}
}
</script>
</head>
<body>
<input type="text" onkeyup="checkPrice(this);"/>
</body>
</html>
身份證號碼的匹配
來源:關(guān)于正則的,大家?guī)蛶兔?急,在線等
身份證號碼可以是15位或者是18位,其中最后一位可以是X。其它全是數(shù)字,正則如下:
/^(\d{14}|\d{17})(\d|[xX])$/開頭是14位或者17位數(shù)字,結(jié)尾可以是數(shù)字或者是x或者是X。
測試代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^(\d{14}|\d{17})(\d|[xX])$/;
var str = '123456789012345';//15位
var str2 = '123456789012345678';//18位
var str3 = '12345678901234567X';//最后一位是X
var str4 = '1234';//位數(shù)不對
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
document.write(testReg(reg,str4)+'<br />');
</script>
要求文本有指定行數(shù)
匹配至少兩行的字符串,每行都為非空字符。
只要匹配到[\n\r]就表示有換行了,再保證換行的兩段都不是空字符就可以了。正則如下:
/\S+?[\n\r]\S+?/i
這個正則的應(yīng)用應(yīng)該是用在textarea里,如果是如下要求:可以支持所有字符,中間可帶空格,可以包括英文、數(shù)字、中文、標(biāo)點(diǎn)
這樣的話,只要針對空格再改一下就行了。(按照非空的要求,上面有不能匹配“字符+空格+換行+字符”的字符串)。修改如下:
/\S+?\s*?[\n\r]\s*?\S+?/i
單詞首字母大寫
來源:求個正則,處理英文單詞或詞組的
每單詞首字大寫,其他小寫。如blue idea轉(zhuǎn)換為Blue Idea,BLUE IDEA也轉(zhuǎn)換為Blue Idea
cloeft的正則:
/\b(\w)|\s(\w)/g
所謂“首字母”包括兩種情況:第一種是邊界(開頭)的單詞字符,一種是空格之后的新單詞的第一個字母。測試代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
str = str.toLowerCase();
return str.replace(reg,function(m){return m.toUpperCase()})
}
var reg = /\b(\w)|\s(\w)/g;
var str = 'blue idea';
var str2 = 'BLUE IDEA';
var str3 = 'Test \n str is no good!';
var str4 = 'final test';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
document.write(replaceReg(reg,str4)+'<br />');
</script>
正則驗(yàn)證日期格式
yyyy-mm-dd格式
正則如下:
/^\d{4}-\d{1,2}-\d{1,2}$/
4位數(shù)字,橫線,1或者2位數(shù)字,再橫線,最后又是1或者2位數(shù)字。
測試代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/;
var str = '2008-8-8';
var str2 = '2008-08-08';
var str3 = '08-08-2008';
var str4 = '2008 08 08';
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
document.write(testReg(reg,str4)+'<br />');
</script>
第二種格式:來源:求一正則表達(dá)式
yyyy-mm-dd
或
yyyy/mm/dd
用“或”簡單地修改一下就行了。
/^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}$/去掉文件的后綴名
來源:求一個正則
www.abc.com/dc/fda.asp變?yōu)閣ww.abc.com/dc/fda
如果文件后綴已知的話這個問題就非常簡單了,正則如下:
/\.asp$/匹配最后的.asp而已,測試代碼如下:
<script type="text/javascript">
function delAspExtension(str){
var reg = /\.asp$/;
return str.replace(reg,'');
}
var str = 'www.abc.com/dc/fda.asp';
document.write(delAspExtension(str)+'<br />');
</script>
如果文件名未知的話就用這個正則:/\.\w+$/,測試代碼如下:
<script type="text/javascript">
function delExtension(str){
var reg = /\.\w+$/;
return str.replace(reg,'');
}
var str = 'example.com/dc/fda.asp';
document.write(delExtension(str)+'<br />');
var str2 = 'test/regular/fda.do';
document.write(delExtension(str2)+'<br />');
var str3 = 'example.com/dc/fda.strange_extension';
document.write(delExtension(str3)+'<br />');
</script>
驗(yàn)證郵箱的正則表達(dá)式
來源:找javascript寫的表單檢查代碼!
fuchangxi的正則:
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/開始必須是一個或者多個單詞字符或者是-,加上@,然后又是一個或者多個單詞字符或者是-。然后是點(diǎn)“.”和單詞字符和-的組合,可以有一個或者多個組合。
<script type="text/javascript">
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
return reg.test(str);
}
var str = 'test@hotmail.com';
document.write(isEmail(str)+'<br />');
var str2 = 'test@sima.vip.com';
document.write(isEmail(str2)+'<br />');
var str3 = 'te-st@qq.com.cn';
document.write(isEmail(str3)+'<br />');
var str4 = 'te_st@sima.vip.com';
document.write(isEmail(str4)+'<br />');
var str5 = 'te.._st@sima.vip.com';
document.write(isEmail(str5)+'<br />');
</script>
我不太了解郵箱的具體規(guī)則。感覺這個正則比較簡單,EMAIL校驗(yàn) 正則 討論 求解里有比較詳細(xì)的郵箱正則討論。
匹配源代碼中的鏈接
來源:正則
能夠匹配HTML代碼中鏈接的正則。
原帖正則:
/<a href=".+?">.+?<\/a>/g感覺有點(diǎn)嚴(yán)格,首先要<a href="".+?">有,而且href屬性可以是一個或者多個除換行外任意字符(非貪婪)。后面是.+?<\/a>,一個或者多個除換行外任意字符(非貪婪),再加上結(jié)束標(biāo)簽。
有個問題,如果a的起始標(biāo)簽最后有空格,或者除了href還有其它屬性的話,上面的正則就不能匹配這個鏈接了。
例如:
<a href="asdfs" >……多了個空格。
<a id="xx" href=""asdfs">……前面有屬性。
……
重寫正則:
/<a\s(\s*\w*?=".+?")*(\s*href=".+?")(\s*\w*?=".+?")*\s*>[\s\S]*?<\/a>/
思路如下:首先要有<a和一個空格。/<a\s/
第一個(\s*\w*?=".+?")*
可以匹配一個屬性,屬性前面可能有或者沒有多余的空格,用\s*匹配;屬性名肯定是單詞字符,用\w*?匹配;=".+?"就是匹配屬性值了非換行字符若干個;整個括號外面加個*表示可能有任意多個屬性。
(\s*href=".+?")
匹配href,它也是一個屬性,所以只要把上面子正則表達(dá)式中的\w修改為href=就行了。
(\s*\w*?=".+?")*重復(fù)第一個子正則表達(dá)式,再次接受任意個屬性。
\s*>,屬性最后再加上若干個空格和>。
[\s\S]*?,鏈接的文字,可能有任何字符組成,若干個,非貪婪。
<\/a>最后是結(jié)束標(biāo)簽。
補(bǔ)充:屬性名和=之間,以及=和屬性值之間也可能有空格。所以要再加上幾個\s*。
最后的實(shí)例代碼如下:
<script type="text/javascript">
function findLinks(str){
var reg = /<a\s(\s*\w*?\s*=\s*".+?")*(\s*href\s*=\s*".+?")(\s*\w*?\s*=\s*".+?")
*\s*>[\s\S]*?<\/a>/g;
var arr = str.match(reg);
for(var i=0;i<arr.length;i++){
//alert(arr[i]);
document.write('link:'+arr[i]+'<br />');
}
}
var str = '<p>測試鏈接:<a id = "test" title="無敵">經(jīng)典論壇
</a></p><a? ? >藍(lán)色理想</a>';
var arr = findLinks(str);
</script>
會把所有的鏈接在頁面直接顯示出來。注意,
本帖遺留問題:如何執(zhí)行從右到左的匹配。貌似JS或者VBS沒有提供這個功能2、JS或者VBS不支持 后行斷言。。用什么方法實(shí)現(xiàn)這個功能。
匹配鏈接的文字
來源:求一正則?
代碼:<a href="#>這里要保存</a>,只保存鏈接的文本內(nèi)容,標(biāo)簽信息刪掉。
前面寫過一個匹配鏈接的正則:
/<a\s(\s*\w*?=".+?")*(\s*href=".+?")(\s*\w*?=".+?")*\s*>[\s\S]*?<\/a>/
不過我們需要捕獲的是文字內(nèi)容,所以需要做一定的修改。第一步就是在所有的括號內(nèi)都加上?:表示不捕獲。第二步就是再多加一個括號放在[\s\S]*?兩側(cè),這樣就可以捕獲到鏈接的文字內(nèi)容了。最后正則如下:
/<a\s(?:\s*\w*?\s*=\s*".+?")*(?:\s*href\s*=\s*".+?")(?:\s*\w*?\s*=\s*".+?")*\s*>([\s\S]*?)<\/a>/測試代碼如下:
<script type="text/javascript">
function anchorText(str){
var reg =/<a\s(?:\s*\w*?\s*=\s*".+?")*(?:\s*href\s*=\s*".+?")(?:\s*\w*?\s*=\s*".+?")*\s*>
([\s\S]*?)<\/a>/;
str = str.replace(reg,'$1');
return str;
}
var str = '<a id = "test" title="無敵">經(jīng)典論壇</a>';
document.write(anchorText(str));
</script>
正則判斷標(biāo)簽是否閉合
來源:求助 超難!正則表達(dá)式如何判斷一個標(biāo)簽是否閉合
例如:<img xxx=”xxx” 就是沒有閉合的標(biāo)簽;
<p>p的內(nèi)容,同樣也是沒閉合的標(biāo)簽。
從簡單的正則開始,先匹配起始標(biāo)簽
/<[a-z]+/i再加上若干屬性:
/<[a-z]+(\s*\w*?\s*=\s*".+?")*/i
下面就到關(guān)鍵點(diǎn)了,標(biāo)簽的閉合。標(biāo)簽可能有兩種方式閉合,<img xxx=”xxx” />
或者是<p>xxx </p>。
(\s*\/>)
匹配img類的結(jié)束,即/>。
(\s*?>[\s\S]*?<\/\1>)
匹配\p類標(biāo)簽的結(jié)束標(biāo)簽。>是其實(shí)標(biāo)簽?zāi)┪?,之后是?biāo)簽內(nèi)容若干個任意字符,最后的<\/\1>就是結(jié)束標(biāo)簽了。
加上一個或就可以解決了,最后的完整正則表達(dá)式:
整個正則:
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?<\/\1>|\s*\/>)/i
拿這個正則,只要匹配到了就表示閉合,沒匹配到則沒有閉合。不過沒有考慮相同標(biāo)簽嵌套的問題,例如
<div>aaaaaa<div>test</div>
也被判斷為合格,可以通過把最后的匹配p類結(jié)束標(biāo)簽寫成子正則表達(dá)式,并且更改為非貪心,然后在匹配結(jié)果中檢查是否成對。正則如下:
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i
用正則獲得指定標(biāo)簽的內(nèi)容
來源:求一正則
有如下代碼:
<channel>
<title>藍(lán)色理想</title>
</channel>
<item>
<title>界面設(shè)計測試規(guī)范</title>
</item>
<item>
<title>《古典寫實(shí)美女》漫畫教程</title>
</item>
<item>
<title>安遠(yuǎn)――消失的光年</title>
</item>
<item>
<title>asp.net 2.0多語言網(wǎng)站解決方案</title>
</item>
要求匹配item里的title而不匹配channel里的title。
基本正則:
/<title>[\s\S]*?<\/title>/gi
首先是title標(biāo)簽,內(nèi)容為任意字符若干個,然后是title結(jié)束標(biāo)簽。這個正則已經(jīng)能匹配到所有的title標(biāo)簽。
首先,我簡單地修改了一下原正則:
/<title>[^<>]*?<\/title>/gi,因?yàn)閠itle里面不應(yīng)該再嵌有其它標(biāo)簽,這個正則同樣是匹配所有標(biāo)題的內(nèi)容,最后再加上不去匹配channel中的title。整個正則如下:
/<title>[^<>]*?<\/title>(?!\s*<\/channel>)/gi(?!\s*<\/channel>)表示要匹配字符串的后面不能跟著若干個空格和一個channel的結(jié)束標(biāo)簽。
原帖里有很方便的測試工具,這里就不給測試代碼了。
正則判斷是否為數(shù)字與字母的混合
來源:關(guān)于正則
不能小于12位,且必須為字母和數(shù)字的混合。
驗(yàn)證字符串包含數(shù)字簡單,驗(yàn)證字符串包含字母也簡單,驗(yàn)證字符串不包含其它字符也簡單,可以用這三個正則分別檢查一次字符串,邏輯運(yùn)算出最終結(jié)果。
但是怎么能把這些功能寫進(jìn)一個正則表達(dá)式里呢?這個問題真有點(diǎn)傷腦筋。
下面是lexrus的正則:
/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig思路非常的清晰?。?
[a-z]+(?=[0-9])
字母開頭,后面必須緊跟著數(shù)字。
[0-9]+(?=[a-z]
數(shù)字開頭,后面必須緊跟著字母。
[a-z0-9]+
后面的字符只要是數(shù)字或者字母就可以了。經(jīng)過測試,發(fā)現(xiàn)不好使,123dd會被識別為不合法,dd123則為合法,可見“數(shù)字開頭,緊跟字母”的正則沒有起作用。測試代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig;
return reg.test(str);
}
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
document.write(istrue(str4)+'<br />');
</script>
結(jié)果為:
false,true,false,false
結(jié)果中的第三個,將'123dd'判斷為非法是錯誤的。剛開始以為是g的問題,去掉了還是不好使。應(yīng)該是瀏覽器bug,我認(rèn)為lexrus的正則是正確的,可能是瀏覽器無法處理或”|”的兩邊都包含正向預(yù)查(?=)。
修改之后的正則如下:
/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i意思和上面差不多,但是沒有使用正向預(yù)查,測試代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
return reg.test(str);
}
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
document.write(istrue(str4)+'<br />');
</script>
結(jié)果為
false,true,true,false
正確。
空格與英文同時存在
來源:正則問題請指教?。?
匹配英文以及空格,要求必須既有英文字母又有空格。
這個思路和上面的差不多,只要把數(shù)字改成空格就可以了。正則如下:
/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i英文開頭加空格,或者是空格開頭加英文,后面可以是英文或者空格。測試代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i;
return reg.test(str);
}
var str? = 'asdf';
var str2 = 'sadf sdf';
var str3 = 'asdf ';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
</script>
利用這個思路也可以實(shí)現(xiàn)英文空格英文,英文單詞多于兩個的匹配。同樣,也可以把英文字母換成單詞字符\w。
顯示或者保存正則表達(dá)式匹配的部分內(nèi)容
有如下電話號碼:
13588888333
13658447322
13558885354
13587774654
13854554786
要求,要求只匹配135開頭的電話,但是匹配結(jié)果只保留135后面的數(shù)字。
由于JavaScript里的正則不支持(?=xx)xxx的模式,只支持xxx(?=xx)的模式。所以只能將135后面的內(nèi)容作為一個子正則表達(dá)式匹配的內(nèi)容,然后再在后面引用。
Carl給出的函數(shù)如下:
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打頭的手機(jī)號碼!";
}
/^(135)(\d{8})$/ 正則中,135作為開頭表示第一個子正則表達(dá)式,第二個括號內(nèi)的子正則表達(dá)式則匹配后面的8個數(shù)字,然后在replace中使用$2就可以引用這個子正則表達(dá)式匹配的內(nèi)容了。測試代碼如下:
<script type="text/javascript">
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打頭的手機(jī)號碼!";
}
var arr = new Array(
"13588888333",
"13658447322",
"13558885354",
"13587774654",
"13854554786"
);
for(var i = 0; i < arr.length; i++)
document.write(f(arr[i])+'<br />');
</script>
正則表達(dá)式替換變量
來源:求教正則
有一個數(shù)組:
var _A = ['A','B','C','D'];
有一個有“變量”的字符串。
var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>';
說是變量,其實(shí)只是字符串中的特殊字符,例如$0$,就稱這個為偽變量吧。
最后的要求就是使用正則獲得下面這樣一個字符串:
_C = '<ul><li>A</li><li>B</li><li>C</li><li>D</li></ul>';
IamUE給出了代碼:
<script type="text/javascript">
var _A = ['A','B','C','D'];
var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>';
var reg=/\$\d+\$/ig;
C=_B.replace(reg,function($1){
var indexnum=$1.replace(/\$/ig,"");
if (indexnum<_A.length)
{return _A[indexnum];}
else{return ""}
});
alert(C);
</script>
代碼分析:看到代碼之后感覺有點(diǎn)暈,首先,正則reg中沒有任何的括號,應(yīng)該是沒有捕獲內(nèi)容的,那么后面怎么又使用$1了引用了呢?通過alert測試,發(fā)現(xiàn)它是整個正則匹配的內(nèi)容,而且不一定要寫作$1,可以寫為$0,甚至是寫為x都沒關(guān)系,它總是整個匹配。
第一次,$1匹配到_B中的“$0$”,匿名函數(shù)中將它的$去掉,變成了0,檢查是否越界之后,用這個0作為下標(biāo)去訪問數(shù)組_A。
由于正則reg定義了g屬性,所以會繼續(xù)替換$1$、$2$等等。步驟都和上面一樣。
正則替換指定屬性中的文本
來源:怎樣用正則來查找替換?
有如下代碼:
<td align="center"><img src="../photo/ccg/thumbnails/O'Malley's West_jpg.gif" border="0" onClick="MM_openBrWindow('../photo/ccg/pages/O'Malley's West_jpg.htm','BE','width=386,height=306')"><br>
O'Malley's West</td>
要求將所有onclick屬性中的'替換成\',也就是將單引號轉(zhuǎn)義。
首先,需要匹配onclick屬性:
/onclick\s*=\s*".+?"/ig然后再將所有的'都替換成\'就可以了。
將阿拉伯?dāng)?shù)字替換為中文大寫形式
來源:正則問題
將123替換成壹貳叁。
只要匹配一個數(shù)字就可以了,測試代碼如下(如果顯示為亂碼就調(diào)整一下瀏覽器的字符編碼):
function replaceReg(reg,str){
return str.replace(reg,function(m){return arr[m];})
}
arr=new Array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖");
var reg = /\d/g;
var str = '13889294444';
var str2 = '12889293333';
var str3 = '23445567';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
替換文本中的URL為鏈接
來源:求一鏈接替換正則
將一個用戶輸入的一段文字中的url替換成可以點(diǎn)擊的link地址。例如:http://www.blueidea.com可以替換成 [url]http://www.cctv.com[/url]
或<a >http://www. blueidea.com</a>.
這個正則的關(guān)鍵就在于匹配鏈接,匹配之后,在兩邊加上a標(biāo)簽和屬性不是問題。
/http:\/\/[\w-]*(\.[\w-]*)+/ig首先匹配http://。
[\w-]*是可能的www和bbs等。
\.[\w-]*匹配.xxx形式,至少有一個。
測試代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,function(m){return '<a href="'+m+'">'+m+'</a>';})
}
var reg = /http:\/\/[\w-]*(\.[\w-]*)+/ig;
var str = '將一個用戶輸入的一段文字中的url替換成可以點(diǎn)擊的link地址。\
測試一下:http://www.blueidea.com緊接著中文,還有http://bbs.blueidea.com \
is very good!http://blueidea.com!最后在看看帶.cn的:http://www.sina.com.cn呵呵。';
document.write(replaceReg(reg,str)+'<br />');
</script>
從HTML代碼段刪除指定標(biāo)簽極其內(nèi)容
來源:關(guān)于正則的問題
在一段代碼中去除<script ...... /script>, <head>...</head>,<%.....%>等代碼塊
隆的正則:
/<(script|meta|%)[\s\S]*?\/(script|meta|%)>/試了一下,匹配如下文本正常:
<script type="text/javascript">
我是要被刪除的腳本
</script>
哎。就剩下我了。但是,如果使用類似的正則:
/<(script|head|%)[\s\S]*?\/(script|head|%)>/ig
匹配有嵌套的標(biāo)簽:
<head>
<script type="text/javascript">
我是要被刪除的腳本
</script>
</head>
哎。就剩下我了。實(shí)際匹配的內(nèi)容是:
<head>
<script type="text/javascript">
我是要被刪除的腳本
</script>
這是因?yàn)閇\s\S]*?里的非貪婪造成的??梢允褂肑avaScript正則里的反向引用來解決這個問題,如果起始標(biāo)簽匹配了head,那么結(jié)束標(biāo)簽也必須是head。最后的正則如下:
/<(script|head|%)[\s\S]*?\/\1>/ig用正則給文本分段
來源:怎樣用正則分段落
原代碼:[title]標(biāo)題一[/title]內(nèi)容一232323sdfga [title]標(biāo)題二[/title]內(nèi)容二2232323 [title]標(biāo)題三[/title]內(nèi)容三2232323
要把文本分段成如下格式:
一、[title]標(biāo)題一[/title]內(nèi)容一232323sdfga
二、[title]標(biāo)題二[/title]內(nèi)容二2232323
三、[title]標(biāo)題三[/title]內(nèi)容三2232323
只要用正則匹配title就可以了,所以正則比較簡單
/\[title\]/ig
至于開始的的漢字序號,只要一個數(shù)組就解決了,最終代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
var mark =0;
return str.replace(reg,function(m){mark++;return '<br />'+arr[mark]+'、'+m;})
}
var arr = ["零","壹","貳","叁","肆","伍","陸","柒","捌","玖"];
var reg = /\[title\]/ig;
var str = '[title]標(biāo)題一[/title]內(nèi)容一232323sdfga \
[title]標(biāo)題二[/title]內(nèi)容二2232323 [title]標(biāo)題三[/title]內(nèi)容三2232323';
document.write(replaceReg(reg,str)+'<br />');
</script>
轉(zhuǎn)換源代碼中的標(biāo)簽
來源:一個正則上的問題
將代碼中的HTML標(biāo)簽img轉(zhuǎn)換為[img]url[/img]。
/<img(?:\s*\w*?\s*=\s*".+?")*?\s*src\s*=\s*"(.+?)"(?:\s*\w*?\s*=\s*".+?")*\s*>/ig
這段正則和匹配鏈接標(biāo)簽的正則基本一樣,修改如下,標(biāo)簽名img,沒有結(jié)束標(biāo)簽而是>結(jié)束。
測試代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,'[img]$1[/img]')
}
var reg =
/<img(?:\s*\w*?\s*=\s*".+?")*?\s*src\s*=\s*"(.+?)"(?:\s*\w*?\s*=\s*".+?")*\s*>/ig;
var str = '我就是傳說中的圖片了<img src="URL">哎。';
document.write(replaceReg(reg,str)+'<br />');
</script>
第二個是替換object代碼嵌入的flash代碼替換為
Flash動畫。
針對原文的正則如下:
/<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i
如果是所有的屬性都有雙引號的話正則也需要修改。
測試如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,'
Flash動畫')
}
var reg = /<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i;
var str = '<object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 \
codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/\
swflash.cab#version=5,0,0,0 width=255 height=250><param name=movie \
value=url><param name=quality value=high><embed src=url quality=high \
pluginspage=http://www.macromedia.com/shockwave/download/index.cgi?\
P1_Prod_Version=ShockwaveFlash type=application/x-shockwave-flash \
width=255 height=250></embed></object>';
document.write(replaceReg(reg,str)+'<br />');
</script>
給屬性添加雙引號
來源:請教正則表達(dá)式高手
給HTML標(biāo)簽中的屬性添加雙引號。
<a href=xxx>改為:<a href="xxx">
LeXRus的第一個正則如下:
/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig第一個括號沒看明白,JS應(yīng)該是不支持。所以我擅自給刪掉了,剩下的正則如下:
/(\s+\w+)\=([^>\"\s]+)/ig第一個括號里的\s+\w+匹配的是屬性名。
然后是=,不用轉(zhuǎn)義。
第二個括號里的[^>\"\s]+匹配屬性值。不匹配>”和空格。這里的引號不用轉(zhuǎn)義。在意思不改變的情況下,稍微改了改,正則如下:
/(\s+\w+)=([^>"\s]+)/ig需要注意的是這個正則不匹配=兩邊有空格的屬性,例如href = xxx。相匹配的話就改成:
/(\s+\w+)\s*=\s*([^>"\s]+)/ig代碼:
str=str.replace(/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig,'$1="$2"');
其中'$1=”$2”'就實(shí)現(xiàn)了給屬性值添加上雙引號。不過ncs指出了這個正則替換的幾個問題,一是上面的空格問題,二是如果非標(biāo)簽內(nèi)部有等號,且前面又恰巧有空白字符的話,它將會被誤識別為屬性,例如:
<a href=xxx target=yyy title = asdfasf> test=sd
里面的test=sd也會被匹配。三是如果屬性原來使用了單引號,會被再包上一層雙引號……
來看看LeXRus前輩的新正則替換方法:
str=str.replace(/(?!<\w+)(\s+\w+)\s*=\s*([^>\"\s]+)(?=[^>]*>)/ig,'$1="$2"')
.replace(/\"\'([^\'\"]+)\'\"/ig,'\"$1\"');先來看第一個正則:
/ (\s+\w+)\s*=\s*([^>"\s]+)(?=[^>]*>)/ig
結(jié)尾新添的(?=[^>]*>)意在解決普通文本中有等號被誤識別為屬性的問題:
<a href=xxx target=yyy title = asdfasf> test=sd
就沒問題了,但是
<a href=xxx target=yyy title = asdfasf> test=sd<tag>又一個標(biāo)簽</tag>
中的test=sd<tag>又會被識別為屬性。
我覺得改成下面的正則就沒問題了:
/(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig
分別在第二個括號的字符集合和最后的反向預(yù)查的字符集合中添加了一個<。
下面再來分析第二個正則,
/\"\'([^\'\"]+)\'\"/ig這個正則用于匹配雙引號,單引號多層嵌套的情況,同樣,不用轉(zhuǎn)義,修改正則如下:
/"'([^'"]*)'"/ig
這樣基本任務(wù)就完成了。測試代碼如下:
<script type="text/javascript">
function rp(str,trg){
var reg1 = /(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig
var reg2 = /"'([^'"]*)'"/ig;
str=str.replace(reg1,'$1="$2"').replace(reg2,'\"$1\"');
trg.value=str;
}
</script>
<textarea id="sou" style="width:100%">
<a href = xxx name=aaa target=_blank title='asdfasf'
onclick=alert('blueidea')> asfd=asfd
</textarea>
<input type="button" onclick="rp(sou.value,sou)" value="replace"/>
原帖里L(fēng)eXRus又提出了新問題:
hint=i am lexrus
這樣的屬性會有問題,不過我感覺不加引號的話,屬性值里就不可能有空格,否則會被識別為多個屬性了。不過看到最后ncs的回帖我就哭了:
onclick=if(document.forms.length>0)
這樣的屬性怎么辦?大于號會被識別為標(biāo)簽結(jié)束……還是分離行為與文檔吧。補(bǔ)充一下,其實(shí)修補(bǔ)一下正則也可以解決,只要改成如下正則即可:
/(\s+\w+)\s*=\s*([^"\s]+)(?=[^<>]*>)/ig就是去掉第二個括號內(nèi)字符集合里的<>。最后這個問題也解決。
給table加上tbody
來源:通過正則表達(dá)式快速在后加上
有若干table,但是沒有tbody。現(xiàn)在需要用正則批量加上。
匹配table結(jié)束標(biāo)簽</table>比較簡單,在前面加上一個</tbody>就行了。
但是,匹配table的起始標(biāo)簽有點(diǎn)難度,因?yàn)榭赡苡袑傩?。不過之前匹配過鏈接了,這個也大同小異。
實(shí)例table代碼如下:
<table width="100%" border="0" cellpadding="2" cellspacing="3">
<table width="100%">
正則:
/<table\s(\s*\w*?\s*=\s*".+?")*?\s*?>/g匹配一個<table,在匹配若干個屬性,最后只要再找到>就代表標(biāo)簽結(jié)束。
之后再replace一下,加上<tbody>就可以了。
去掉標(biāo)簽的所有屬性
來源:正則表達(dá)式(Dreamweaver8)
<td style="width: 23px; height: 26px;" align="left">***</td>
變成沒有任何屬性的
<td>***</td>
思路:非捕獲匹配屬性,捕獲匹配標(biāo)簽,使用捕獲結(jié)果替換掉字符串。正則如下:
/(<td)\s(?:\s*\w*?\s*=\s*".+?")*?\s*?(>)/首先,td匹配掉了標(biāo)簽,后面可以用$1引用,后面的若干屬性被(?:)匹配掉,而最后匹配的>則可以在后面用$2引用。
示意代碼:
str = str.replace(reg,'$1$2');
正則替換特定單詞
來源:正則表達(dá)式,拒絕幾個單詞的輸入該怎樣表達(dá)?
要求禁止輸入某幾個單詞,如果拒絕red,yellow,white。這個帖子到時不難,但是讓我弄清楚了好幾個概念。
第一個,小心字符集合里的“或”
/[^red|yellow|white]/這個正則里的所有或都沒有意義,等同于:
/[^redyellowwhite]/意思就是不能含有以下列出的所有字母。
正解:
/red|yellow|white/第二個概念:
只要整個正則匹配成功,無論子正則表達(dá)式是否匹配成功,括號都會捕捉。例如
/(red)|(yellow)|(white)/會捕捉到三個結(jié)果,盡管實(shí)際上最多只可能有一個括號匹配成功。但是只要有一個匹配到了,兩外兩個也會記錄空串。
指定文字高亮顯示
來源:如何用正則把網(wǎng)頁中的指定的字高亮顯示
請教正則表達(dá)式:如何替換搜索結(jié)果中的關(guān)鍵字為高亮顯示?
不勞而獲一次,這個子虛烏有前輩已經(jīng)給出了非常好的解決方案:我直接把代碼貼出來了:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<META name="Author" content="Sheneyan" />
<script type="text/javascript">
function encode(s){
return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/([\\\.\*\[\]\(\)\$\^])/g,"\\$1");
}
function decode(s){
return s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g,"$1").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&");
}
function highlight(s){
if (s.length==0){
alert('搜索關(guān)鍵詞未填寫!');
return false;
}
s=encode(s);
var obj=document.getElementsByTagName("body")[0];
var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1");
obj.innerHTML=t;
var cnt=loopSearch(s,obj);
t=obj.innerHTML
var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g
t=t.replace(r,"<span class='highlight'>$1</span>");
obj.innerHTML=t;
alert("搜索到關(guān)鍵詞"+cnt+"處")
}
function loopSearch(s,obj){
var cnt=0;
if (obj.nodeType==3){
cnt=replace(s,obj);
return cnt;
}
for (var i=0,c;c=obj.childNodes[i];i++){
if (!c.className||c.className!="highlight")
cnt+=loopSearch(s,c);
}
return cnt;
}
function replace(s,dest){
var r=new RegExp(s,"g");
var tm=null;
var t=dest.nodeValue;
var cnt=0;
if (tm=t.match(r)){
cnt=tm.length;
t=t.replace(r,"{searchHL}"+decode(s)+"{/searchHL}")
dest.nodeValue=t;
}
return cnt;
}
</script>
<style type="text/css">
.highlight{background:green;font-weight:bold;color:white;}
</style>
</head>
<body>
<form onsubmit="highlight(this.s.value);return false;">
<p><input name="s" id="s" title="搜索內(nèi)容:"/><input type="submit" value="搜索"/></p>
</form>
<div id="content">
測試高亮的代碼。很長很長的代碼……………………
</div>
</body>
</html>
刪除標(biāo)簽
來源:如何使用正則表達(dá)式去除大部分HTML標(biāo)記?
刪除除了<img>、<br>、<p>之外所有的標(biāo)簽。子虛烏有給出代碼中關(guān)鍵的一句:
o.innerHTML.replace(/(<\/?(?!br|p|img)[^>\/]*)\/?>/gi,'');
剛開始沒反應(yīng)過來,后來才想起來,這個正則不用區(qū)分起始和結(jié)束標(biāo)簽。
<\/?(?!br|p|img)
匹配除了保護(hù)標(biāo)簽外標(biāo)簽的起始標(biāo)簽或者是結(jié)束標(biāo)簽的一部分。
[^>\/]*
匹配到>或者/就結(jié)束。
\/?>
起始標(biāo)簽或者結(jié)束標(biāo)簽的結(jié)尾。
本文不是使用Dreamweaver編輯,以下測試代碼可能已經(jīng)在賦值粘貼的過程做了一些調(diào)整,可能執(zhí)行失效??梢詤⒖幢疚牡膒df版本。
匹配結(jié)尾的數(shù)字
如
復(fù)制代碼 代碼如下:
30CAC0040 取出40
3SFASDF92 取出92
正則如下:/\d+$/g
統(tǒng)一空格個數(shù)
字符串內(nèi)字符鍵有空格,但是空格的數(shù)量可能不一致,通過正則將空格的個數(shù)統(tǒng)一變?yōu)橐粋€。
例如:藍(lán) 色 理 想
變成:藍(lán) 色 理 想
aobert的正則:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
var str="藍(lán) 色 理 想"
var reg=/\s+/g
str = str.replace(reg," ")
document.write(str)
</script>
判斷字符串是不是由數(shù)字組成
來源:有沒有簡單的方法判斷字符串由數(shù)字組成?
這個正則比較簡單,寫了一個測試
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function isDigit(str){
var reg = /^\d*$/;
return reg.test(str);
}
var str = "7654321";
document.write(isDigit(str));
var str = "test";
document.write(isDigit(str));
</script>
電話號碼正則
:求一個驗(yàn)證電話號碼的JS正則
復(fù)制代碼 代碼如下:
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/區(qū)號必填為3-4位的數(shù)字,區(qū)號之后用“-”與電話號碼連接
^\d{3,4}-電話號碼為7-8位的數(shù)字
\d{7,8}分機(jī)號碼為3-4位的數(shù)字,非必填,但若填寫則以“-”與電話號碼相連接
(-\d{3,4})?手機(jī)號碼正則表達(dá)式
正則驗(yàn)證手機(jī)號,忽略前面的0,支持130-139,150-159。忽略前面0之后判斷它是11位的。
cloeft的正則:
復(fù)制代碼 代碼如下:
/^0*(13|15)\d{9}$/^0*匹配掉開頭任意數(shù)量的0。
腳本之家發(fā)布的手機(jī)號碼
復(fù)制代碼 代碼如下:
function checkMobile(){
var sMobile = document.mobileform.mobile.value
if(!(/^1[3|4|5|8][0-9]\d{4,8}$/.test(sMobile))){
alert("不是完整的11位手機(jī)號或者正確的手機(jī)號前七位");
document.mobileform.mobile.focus();
return false;
}
}
由于手機(jī)號碼是13任意數(shù)字9位,和15任意數(shù)字9位,所以可以用(13|15)\d{9}匹配。
測試代碼如下:
復(fù)制代碼 代碼如下:
function testReg(reg,str){
return reg.test(str);
}
var reg =/^1[3|4|5|8][0-9]\d{4,8}$/;
var str = '13889294444';
var str2 = '12889293333';
var str3 = '23445567';
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
使用正則表達(dá)式實(shí)現(xiàn)刪除字符串中的空格:
來源:請問js中有沒有去掉空格的函數(shù)
代碼以及測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
//刪除字符串兩側(cè)的空白字符。
function trim(str){
return str.replace(/^\s+|\s+$/g,'');
}
//刪除字符串左側(cè)的空白字符。
function ltrim(str){
return str.replace(/^\s+/g,'');
}
//刪除字符串右側(cè)的空白字符。
function rtrim(str){
return str.replace(/\s+$/g,'');
}
//以下為測試代碼
var trimTest = " 123456789 ";
//前后各有一個空格。
document.write('length:'+trimTest.length+'<br />');
//使用前
document.write('ltrim length:'+ltrim(trimTest).length+'<br />');
//使用ltrim后
document.write('rtrim length:'+rtrim(trimTest).length+'<br />');
//使用rtrim后
document.write('trim length:'+trim(trimTest).length+'<br />');
//使用trim后
</script>
測試的結(jié)果如下:
length:11
ltrim length:10
rtrim length:10
trim length:9限制文本框只能輸入數(shù)字和小數(shù)點(diǎn)等等
來源:文本框輸入限制的問題????
只能輸入數(shù)字和小數(shù)點(diǎn)
復(fù)制代碼 代碼如下:
var reg = /^\d*\.?\d{0,2}$/開頭有若干個數(shù)字,中間有0個或者一個小數(shù)點(diǎn),結(jié)尾有0到2個數(shù)字。
只能輸入小寫的英文字母和小數(shù)點(diǎn),和冒號,正反斜杠(:./\)
復(fù)制代碼 代碼如下:
var reg = /[a-z\.\/\\:]+/;a-z包括了小寫的英文字母,\.是小數(shù)點(diǎn),\/和\\分別是左右反斜線,最后是冒號。整個組成一個字符集和代碼任一均可,最后在加上+,1或者多個。
替換小數(shù)點(diǎn)前內(nèi)容為指定內(nèi)容
請問 怎么把這個字符串的小數(shù)點(diǎn)前面的字符替換為我自定義的字符串???
例如:infomarket.php?id=197 替換為 test.php?id=197
應(yīng)該可以把第一個點(diǎn)“.”之前的所有單詞字符替換為test就可以了。我寫的正則如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
var str = "infomarket.php?id=197";
var reg = /^\w*/ig;
//匹配字符串開頭的任意個單詞字符
str = str.replace(reg,'test');
document.write(str);
</script>
原帖的有點(diǎn)復(fù)雜,沒太看明白。
只匹配中文的正則表達(dá)式
前兩天看的《JavaScript開發(fā)王》里恰好有中文的unicode范圍,正則如下:
/[\u4E00-\u9FA5\uf900-\ufa2d]/寫了一個簡單的測試,會把所有的中文替換成“哦”。
復(fù)制代碼 代碼如下:
<script type="text/javascript">
var str = "有中文?and English.";
var reg = /[\u4E00-\u9FA5\uf900-\ufa2d]/ig;
str = str.replace(reg,'哦');
document.write(str);
</script>
返回字符串的中文字符個數(shù)
一般的字符長度對中文和英文都是不分別的 如JS里的length,那么如何返回字符串中中文字符的個數(shù)呢?guoshuang老師在原帖中給出了解決方案,我又沒看懂……
不過我自己也想到了一個辦法:先去掉非中文字符,再返回length屬性。函數(shù)以及測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function cLength(str){
var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
//匹配非中文的正則表達(dá)式
var temp = str.replace(reg,'');
return temp.length;
}
var str = "中文123";
document.write(str.length+'<br />');
document.write(cLength(str));
</script>
結(jié)果:
5
2中文兩個,數(shù)字三個,正確。
下面的測試也正確。
復(fù)制代碼 代碼如下:
var str = "中文123tets@#!#%$#[][{}";
document.write(str.length+'<br />');
document.write(cLength(str));
正則表達(dá)式取得匹配IP地址前三段
來源:如何用正則取IP前3段
192.168.118.101,192.168.118.72, 192.168.118.1都替換成:192.168.118
只要匹配掉最后一段并且替換為空字符串就行了,正則如下:
/\.\d{1,3}$/匹配結(jié)尾的.n,.nn或者.nnn。
測試代碼如下:
復(fù)制代碼 代碼如下:
function replaceReg(reg,str){
return str.replace(reg,'')
}
var reg = /\.\d{1,3}$/;
var str = '192.168.118.101';
var str2 = '192.168.118.72';
var str3 = '192.168.118.1';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
相似的有,這個帖子里有一個驗(yàn)證IP地址的方法:求檢驗(yàn)MAC地址的正則表達(dá)例子
匹配<ul>與<ul>之間的內(nèi)容
<ul>safsf<ul>safsf</ul><ul>safsf</ul></ul>
用正則可以得到 <ul>起到下個<ul> 之間的內(nèi)容。
正則如下:
復(fù)制代碼 代碼如下:
/<ul>[\s\S]+?<ul>/i
首先匹配兩側(cè)的ul標(biāo)簽,中間的[\s\S]+?可以匹配一個或者多個任意字符,一定要非貪婪,否則會匹配<ul>safsf<ul>safsf</ul><ul>。
用正則表達(dá)式獲得文件名
c:\images\tupian\006.jpg
可能是直接在盤符根目錄下,也可能在好幾層目錄下,要求替換到只剩文件名。
xlez的正則如下:
復(fù)制代碼 代碼如下:
/[^\\\/]*[\\\/]+/g
首先匹配非左右斜線字符0或多個,然后是左右斜線一個或者多個。形如“xxx/”或者“xxx\”或者“/”或者“\”
函數(shù)以及測試代碼:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function getFileName(str){
var reg = /[^\\\/]*[\\\/]+/g;
//xxx\或者是xxx/
str = str.replace(reg,'');
return str;
}
var str = "c:\\images\\tupian\\006.jpg";
document.write(getFileName(str)+'<br />');
var str2 = "c:/images/tupian/test2.jpg";
document.write(getFileName(str2));
</script>
注意,\需要轉(zhuǎn)義。
絕對路徑變相對路徑
來源:討論一個正則
將<IMG height="120" width="800" src="http://23.123.22.12/image/somepic.gif">轉(zhuǎn)換為:<IMG height="120" width="800" src="/image/somepic.gif">。
其中網(wǎng)址可能改變,例如http://localhost等等。
cloudchen的正則:
/http:\/\/[^\/]+/首先是http://,然后[^\/]+找過1個或者多個非/字符,因?yàn)橛龅降谝粋€/表示已經(jīng)到目錄了,停止匹配。
測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
var str = '<IMG height="120" width="800" \
src="http://23.123.22.12/image/somepic.gif">';
var reg = /http:\/\/[^\/]+/;
str = str.replace(reg,"");
alert(str)
</script>
用戶名正則
用于用戶名注冊,,用戶名只 能用 中文、英文、數(shù)字、下劃線、4-16個字符。
hansir和解決方案弄成正則:
復(fù)制代碼 代碼如下:
/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/
中文字符或者單詞字符,4到16個。實(shí)現(xiàn)4到16結(jié)成到正則里的關(guān)鍵就是開始^和結(jié)束$,這就等于整個字符串只能有這些匹配的內(nèi)容,不能有多余的。
函數(shù)和測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function isEmail(str){
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/;
return reg.test(str);
}
var str = '超級無敵用戶名regExp';
var str2 = '搗亂的@';
var str3 = '太短'
var str4 = '太長longlonglonglonglonglonglonglong'
document.write(isEmail(str)+'<br />');
document.write(isEmail(str2)+'<br />');
document.write(isEmail(str3)+'<br />');
document.write(isEmail(str4)+'<br />');
</script>
匹配英文地址
來源:-求助- 正則問題
規(guī)則如下:
包含 "點(diǎn)", "字母","空格","逗號","數(shù)字",但開頭和結(jié)尾不能是除字母外任何字符。
[\.a-zA-Z\s,0-9]這個字符集就實(shí)現(xiàn)了字母,空格,逗號和數(shù)字。最終正則如下:
/^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/
開頭必須有字母,結(jié)束也必須是一個以上字母。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/;
var str = 'No.8,ChangAn Street,BeiJing,China';
var str2 = '8.No,ChangAn Street,BeiJing,China';
var str3 = 'No.8,ChangAn Street,BeiJing,China88';
document.write(testReg(reg,str)+'<br />')
document.write(testReg(reg,str2)+'<br />')
document.write(testReg(reg,str3)+'<br />')
</script>
正則匹配價格
價格的格式應(yīng)該如下:
開頭數(shù)字若干位,可能有一個小數(shù)點(diǎn),小數(shù)點(diǎn)后面可以有兩位數(shù)字。hansir給出的對應(yīng)正則如下:
/^(\d*\.\d{0,2}|\d+).*$/
hansir給出的測試代碼如下:
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標(biāo)題文檔</title>
<script type="text/javascript">
function checkPrice(me){
if(!(/^(?:\d+|\d+\.\d{0,2})$/.test(me.value))){
me.value = me.value.replace(/^(\d*\.\d{0,2}|\d+).*$/,'$1');
}
}
</script>
</head>
<body>
<input type="text" onkeyup="checkPrice(this);"/>
</body>
</html>
身份證號碼的匹配
來源:關(guān)于正則的,大家?guī)蛶兔?急,在線等
身份證號碼可以是15位或者是18位,其中最后一位可以是X。其它全是數(shù)字,正則如下:
/^(\d{14}|\d{17})(\d|[xX])$/開頭是14位或者17位數(shù)字,結(jié)尾可以是數(shù)字或者是x或者是X。
測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^(\d{14}|\d{17})(\d|[xX])$/;
var str = '123456789012345';//15位
var str2 = '123456789012345678';//18位
var str3 = '12345678901234567X';//最后一位是X
var str4 = '1234';//位數(shù)不對
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
document.write(testReg(reg,str4)+'<br />');
</script>
要求文本有指定行數(shù)
匹配至少兩行的字符串,每行都為非空字符。
只要匹配到[\n\r]就表示有換行了,再保證換行的兩段都不是空字符就可以了。正則如下:
/\S+?[\n\r]\S+?/i
這個正則的應(yīng)用應(yīng)該是用在textarea里,如果是如下要求:可以支持所有字符,中間可帶空格,可以包括英文、數(shù)字、中文、標(biāo)點(diǎn)
這樣的話,只要針對空格再改一下就行了。(按照非空的要求,上面有不能匹配“字符+空格+換行+字符”的字符串)。修改如下:
/\S+?\s*?[\n\r]\s*?\S+?/i
單詞首字母大寫
來源:求個正則,處理英文單詞或詞組的
每單詞首字大寫,其他小寫。如blue idea轉(zhuǎn)換為Blue Idea,BLUE IDEA也轉(zhuǎn)換為Blue Idea
cloeft的正則:
復(fù)制代碼 代碼如下:
/\b(\w)|\s(\w)/g
所謂“首字母”包括兩種情況:第一種是邊界(開頭)的單詞字符,一種是空格之后的新單詞的第一個字母。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
str = str.toLowerCase();
return str.replace(reg,function(m){return m.toUpperCase()})
}
var reg = /\b(\w)|\s(\w)/g;
var str = 'blue idea';
var str2 = 'BLUE IDEA';
var str3 = 'Test \n str is no good!';
var str4 = 'final test';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
document.write(replaceReg(reg,str4)+'<br />');
</script>
正則驗(yàn)證日期格式
yyyy-mm-dd格式
正則如下:
復(fù)制代碼 代碼如下:
/^\d{4}-\d{1,2}-\d{1,2}$/
4位數(shù)字,橫線,1或者2位數(shù)字,再橫線,最后又是1或者2位數(shù)字。
測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function testReg(reg,str){
return reg.test(str);
}
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/;
var str = '2008-8-8';
var str2 = '2008-08-08';
var str3 = '08-08-2008';
var str4 = '2008 08 08';
document.write(testReg(reg,str)+'<br />');
document.write(testReg(reg,str2)+'<br />');
document.write(testReg(reg,str3)+'<br />');
document.write(testReg(reg,str4)+'<br />');
</script>
第二種格式:來源:求一正則表達(dá)式
yyyy-mm-dd
或
yyyy/mm/dd
用“或”簡單地修改一下就行了。
/^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}$/去掉文件的后綴名
來源:求一個正則
www.abc.com/dc/fda.asp變?yōu)閣ww.abc.com/dc/fda
如果文件后綴已知的話這個問題就非常簡單了,正則如下:
/\.asp$/匹配最后的.asp而已,測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function delAspExtension(str){
var reg = /\.asp$/;
return str.replace(reg,'');
}
var str = 'www.abc.com/dc/fda.asp';
document.write(delAspExtension(str)+'<br />');
</script>
如果文件名未知的話就用這個正則:/\.\w+$/,測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function delExtension(str){
var reg = /\.\w+$/;
return str.replace(reg,'');
}
var str = 'example.com/dc/fda.asp';
document.write(delExtension(str)+'<br />');
var str2 = 'test/regular/fda.do';
document.write(delExtension(str2)+'<br />');
var str3 = 'example.com/dc/fda.strange_extension';
document.write(delExtension(str3)+'<br />');
</script>
驗(yàn)證郵箱的正則表達(dá)式
來源:找javascript寫的表單檢查代碼!
fuchangxi的正則:
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/開始必須是一個或者多個單詞字符或者是-,加上@,然后又是一個或者多個單詞字符或者是-。然后是點(diǎn)“.”和單詞字符和-的組合,可以有一個或者多個組合。
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
return reg.test(str);
}
var str = 'test@hotmail.com';
document.write(isEmail(str)+'<br />');
var str2 = 'test@sima.vip.com';
document.write(isEmail(str2)+'<br />');
var str3 = 'te-st@qq.com.cn';
document.write(isEmail(str3)+'<br />');
var str4 = 'te_st@sima.vip.com';
document.write(isEmail(str4)+'<br />');
var str5 = 'te.._st@sima.vip.com';
document.write(isEmail(str5)+'<br />');
</script>
我不太了解郵箱的具體規(guī)則。感覺這個正則比較簡單,EMAIL校驗(yàn) 正則 討論 求解里有比較詳細(xì)的郵箱正則討論。
匹配源代碼中的鏈接
來源:正則
能夠匹配HTML代碼中鏈接的正則。
原帖正則:
/<a href=".+?">.+?<\/a>/g感覺有點(diǎn)嚴(yán)格,首先要<a href="".+?">有,而且href屬性可以是一個或者多個除換行外任意字符(非貪婪)。后面是.+?<\/a>,一個或者多個除換行外任意字符(非貪婪),再加上結(jié)束標(biāo)簽。
有個問題,如果a的起始標(biāo)簽最后有空格,或者除了href還有其它屬性的話,上面的正則就不能匹配這個鏈接了。
例如:
<a href="asdfs" >……多了個空格。
<a id="xx" href=""asdfs">……前面有屬性。
……
重寫正則:
/<a\s(\s*\w*?=".+?")*(\s*href=".+?")(\s*\w*?=".+?")*\s*>[\s\S]*?<\/a>/
思路如下:首先要有<a和一個空格。/<a\s/
第一個(\s*\w*?=".+?")*
可以匹配一個屬性,屬性前面可能有或者沒有多余的空格,用\s*匹配;屬性名肯定是單詞字符,用\w*?匹配;=".+?"就是匹配屬性值了非換行字符若干個;整個括號外面加個*表示可能有任意多個屬性。
(\s*href=".+?")
匹配href,它也是一個屬性,所以只要把上面子正則表達(dá)式中的\w修改為href=就行了。
(\s*\w*?=".+?")*重復(fù)第一個子正則表達(dá)式,再次接受任意個屬性。
\s*>,屬性最后再加上若干個空格和>。
[\s\S]*?,鏈接的文字,可能有任何字符組成,若干個,非貪婪。
<\/a>最后是結(jié)束標(biāo)簽。
補(bǔ)充:屬性名和=之間,以及=和屬性值之間也可能有空格。所以要再加上幾個\s*。
最后的實(shí)例代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function findLinks(str){
var reg = /<a\s(\s*\w*?\s*=\s*".+?")*(\s*href\s*=\s*".+?")(\s*\w*?\s*=\s*".+?")
*\s*>[\s\S]*?<\/a>/g;
var arr = str.match(reg);
for(var i=0;i<arr.length;i++){
//alert(arr[i]);
document.write('link:'+arr[i]+'<br />');
}
}
var str = '<p>測試鏈接:<a id = "test" title="無敵">經(jīng)典論壇
</a></p><a? ? >藍(lán)色理想</a>';
var arr = findLinks(str);
</script>
會把所有的鏈接在頁面直接顯示出來。注意,
本帖遺留問題:如何執(zhí)行從右到左的匹配。貌似JS或者VBS沒有提供這個功能2、JS或者VBS不支持 后行斷言。。用什么方法實(shí)現(xiàn)這個功能。
匹配鏈接的文字
來源:求一正則?
代碼:<a href="#>這里要保存</a>,只保存鏈接的文本內(nèi)容,標(biāo)簽信息刪掉。
前面寫過一個匹配鏈接的正則:
/<a\s(\s*\w*?=".+?")*(\s*href=".+?")(\s*\w*?=".+?")*\s*>[\s\S]*?<\/a>/
不過我們需要捕獲的是文字內(nèi)容,所以需要做一定的修改。第一步就是在所有的括號內(nèi)都加上?:表示不捕獲。第二步就是再多加一個括號放在[\s\S]*?兩側(cè),這樣就可以捕獲到鏈接的文字內(nèi)容了。最后正則如下:
/<a\s(?:\s*\w*?\s*=\s*".+?")*(?:\s*href\s*=\s*".+?")(?:\s*\w*?\s*=\s*".+?")*\s*>([\s\S]*?)<\/a>/測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function anchorText(str){
var reg =/<a\s(?:\s*\w*?\s*=\s*".+?")*(?:\s*href\s*=\s*".+?")(?:\s*\w*?\s*=\s*".+?")*\s*>
([\s\S]*?)<\/a>/;
str = str.replace(reg,'$1');
return str;
}
var str = '<a id = "test" title="無敵">經(jīng)典論壇</a>';
document.write(anchorText(str));
</script>
正則判斷標(biāo)簽是否閉合
來源:求助 超難!正則表達(dá)式如何判斷一個標(biāo)簽是否閉合
例如:<img xxx=”xxx” 就是沒有閉合的標(biāo)簽;
<p>p的內(nèi)容,同樣也是沒閉合的標(biāo)簽。
從簡單的正則開始,先匹配起始標(biāo)簽
/<[a-z]+/i再加上若干屬性:
/<[a-z]+(\s*\w*?\s*=\s*".+?")*/i
下面就到關(guān)鍵點(diǎn)了,標(biāo)簽的閉合。標(biāo)簽可能有兩種方式閉合,<img xxx=”xxx” />
或者是<p>xxx </p>。
(\s*\/>)
匹配img類的結(jié)束,即/>。
(\s*?>[\s\S]*?<\/\1>)
匹配\p類標(biāo)簽的結(jié)束標(biāo)簽。>是其實(shí)標(biāo)簽?zāi)┪?,之后是?biāo)簽內(nèi)容若干個任意字符,最后的<\/\1>就是結(jié)束標(biāo)簽了。
加上一個或就可以解決了,最后的完整正則表達(dá)式:
整個正則:
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?<\/\1>|\s*\/>)/i
拿這個正則,只要匹配到了就表示閉合,沒匹配到則沒有閉合。不過沒有考慮相同標(biāo)簽嵌套的問題,例如
<div>aaaaaa<div>test</div>
也被判斷為合格,可以通過把最后的匹配p類結(jié)束標(biāo)簽寫成子正則表達(dá)式,并且更改為非貪心,然后在匹配結(jié)果中檢查是否成對。正則如下:
/<([a-z]+)(\s*\w*?\s*=\s*".+?")*(\s*?>[\s\S]*?(<\/\1>)+|\s*\/>)/i
用正則獲得指定標(biāo)簽的內(nèi)容
來源:求一正則
有如下代碼:
復(fù)制代碼 代碼如下:
<channel>
<title>藍(lán)色理想</title>
</channel>
<item>
<title>界面設(shè)計測試規(guī)范</title>
</item>
<item>
<title>《古典寫實(shí)美女》漫畫教程</title>
</item>
<item>
<title>安遠(yuǎn)――消失的光年</title>
</item>
<item>
<title>asp.net 2.0多語言網(wǎng)站解決方案</title>
</item>
要求匹配item里的title而不匹配channel里的title。
基本正則:
/<title>[\s\S]*?<\/title>/gi
首先是title標(biāo)簽,內(nèi)容為任意字符若干個,然后是title結(jié)束標(biāo)簽。這個正則已經(jīng)能匹配到所有的title標(biāo)簽。
首先,我簡單地修改了一下原正則:
/<title>[^<>]*?<\/title>/gi,因?yàn)閠itle里面不應(yīng)該再嵌有其它標(biāo)簽,這個正則同樣是匹配所有標(biāo)題的內(nèi)容,最后再加上不去匹配channel中的title。整個正則如下:
/<title>[^<>]*?<\/title>(?!\s*<\/channel>)/gi(?!\s*<\/channel>)表示要匹配字符串的后面不能跟著若干個空格和一個channel的結(jié)束標(biāo)簽。
原帖里有很方便的測試工具,這里就不給測試代碼了。
正則判斷是否為數(shù)字與字母的混合
來源:關(guān)于正則
不能小于12位,且必須為字母和數(shù)字的混合。
驗(yàn)證字符串包含數(shù)字簡單,驗(yàn)證字符串包含字母也簡單,驗(yàn)證字符串不包含其它字符也簡單,可以用這三個正則分別檢查一次字符串,邏輯運(yùn)算出最終結(jié)果。
但是怎么能把這些功能寫進(jìn)一個正則表達(dá)式里呢?這個問題真有點(diǎn)傷腦筋。
下面是lexrus的正則:
/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig思路非常的清晰?。?
[a-z]+(?=[0-9])
字母開頭,后面必須緊跟著數(shù)字。
[0-9]+(?=[a-z]
數(shù)字開頭,后面必須緊跟著字母。
[a-z0-9]+
后面的字符只要是數(shù)字或者字母就可以了。經(jīng)過測試,發(fā)現(xiàn)不好使,123dd會被識別為不合法,dd123則為合法,可見“數(shù)字開頭,緊跟字母”的正則沒有起作用。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig;
return reg.test(str);
}
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
document.write(istrue(str4)+'<br />');
</script>
結(jié)果為:
false,true,false,false
結(jié)果中的第三個,將'123dd'判斷為非法是錯誤的。剛開始以為是g的問題,去掉了還是不好使。應(yīng)該是瀏覽器bug,我認(rèn)為lexrus的正則是正確的,可能是瀏覽器無法處理或”|”的兩邊都包含正向預(yù)查(?=)。
修改之后的正則如下:
/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i意思和上面差不多,但是沒有使用正向預(yù)查,測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
return reg.test(str);
}
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
document.write(istrue(str4)+'<br />');
</script>
結(jié)果為
false,true,true,false
正確。
空格與英文同時存在
來源:正則問題請指教?。?
匹配英文以及空格,要求必須既有英文字母又有空格。
這個思路和上面的差不多,只要把數(shù)字改成空格就可以了。正則如下:
/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i英文開頭加空格,或者是空格開頭加英文,后面可以是英文或者空格。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function istrue(str){
var reg=/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i;
return reg.test(str);
}
var str? = 'asdf';
var str2 = 'sadf sdf';
var str3 = 'asdf ';
document.write(istrue(str)+'<br />');
document.write(istrue(str2)+'<br />');
document.write(istrue(str3)+'<br />');
</script>
利用這個思路也可以實(shí)現(xiàn)英文空格英文,英文單詞多于兩個的匹配。同樣,也可以把英文字母換成單詞字符\w。
顯示或者保存正則表達(dá)式匹配的部分內(nèi)容
有如下電話號碼:
13588888333
13658447322
13558885354
13587774654
13854554786
要求,要求只匹配135開頭的電話,但是匹配結(jié)果只保留135后面的數(shù)字。
由于JavaScript里的正則不支持(?=xx)xxx的模式,只支持xxx(?=xx)的模式。所以只能將135后面的內(nèi)容作為一個子正則表達(dá)式匹配的內(nèi)容,然后再在后面引用。
Carl給出的函數(shù)如下:
復(fù)制代碼 代碼如下:
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打頭的手機(jī)號碼!";
}
/^(135)(\d{8})$/ 正則中,135作為開頭表示第一個子正則表達(dá)式,第二個括號內(nèi)的子正則表達(dá)式則匹配后面的8個數(shù)字,然后在replace中使用$2就可以引用這個子正則表達(dá)式匹配的內(nèi)容了。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打頭的手機(jī)號碼!";
}
var arr = new Array(
"13588888333",
"13658447322",
"13558885354",
"13587774654",
"13854554786"
);
for(var i = 0; i < arr.length; i++)
document.write(f(arr[i])+'<br />');
</script>
正則表達(dá)式替換變量
來源:求教正則
有一個數(shù)組:
var _A = ['A','B','C','D'];
有一個有“變量”的字符串。
var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>';
說是變量,其實(shí)只是字符串中的特殊字符,例如$0$,就稱這個為偽變量吧。
最后的要求就是使用正則獲得下面這樣一個字符串:
_C = '<ul><li>A</li><li>B</li><li>C</li><li>D</li></ul>';
IamUE給出了代碼:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
var _A = ['A','B','C','D'];
var _B = '<ul><li>$0$</li><li>$1$</li><li>$2$</li><li>$3$</li></ul>';
var reg=/\$\d+\$/ig;
C=_B.replace(reg,function($1){
var indexnum=$1.replace(/\$/ig,"");
if (indexnum<_A.length)
{return _A[indexnum];}
else{return ""}
});
alert(C);
</script>
代碼分析:看到代碼之后感覺有點(diǎn)暈,首先,正則reg中沒有任何的括號,應(yīng)該是沒有捕獲內(nèi)容的,那么后面怎么又使用$1了引用了呢?通過alert測試,發(fā)現(xiàn)它是整個正則匹配的內(nèi)容,而且不一定要寫作$1,可以寫為$0,甚至是寫為x都沒關(guān)系,它總是整個匹配。
第一次,$1匹配到_B中的“$0$”,匿名函數(shù)中將它的$去掉,變成了0,檢查是否越界之后,用這個0作為下標(biāo)去訪問數(shù)組_A。
由于正則reg定義了g屬性,所以會繼續(xù)替換$1$、$2$等等。步驟都和上面一樣。
正則替換指定屬性中的文本
來源:怎樣用正則來查找替換?
有如下代碼:
<td align="center"><img src="../photo/ccg/thumbnails/O'Malley's West_jpg.gif" border="0" onClick="MM_openBrWindow('../photo/ccg/pages/O'Malley's West_jpg.htm','BE','width=386,height=306')"><br>
O'Malley's West</td>
要求將所有onclick屬性中的'替換成\',也就是將單引號轉(zhuǎn)義。
首先,需要匹配onclick屬性:
/onclick\s*=\s*".+?"/ig然后再將所有的'都替換成\'就可以了。
將阿拉伯?dāng)?shù)字替換為中文大寫形式
來源:正則問題
將123替換成壹貳叁。
只要匹配一個數(shù)字就可以了,測試代碼如下(如果顯示為亂碼就調(diào)整一下瀏覽器的字符編碼):
復(fù)制代碼 代碼如下:
function replaceReg(reg,str){
return str.replace(reg,function(m){return arr[m];})
}
arr=new Array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖");
var reg = /\d/g;
var str = '13889294444';
var str2 = '12889293333';
var str3 = '23445567';
document.write(replaceReg(reg,str)+'<br />');
document.write(replaceReg(reg,str2)+'<br />');
document.write(replaceReg(reg,str3)+'<br />');
替換文本中的URL為鏈接
來源:求一鏈接替換正則
將一個用戶輸入的一段文字中的url替換成可以點(diǎn)擊的link地址。例如:http://www.blueidea.com可以替換成 [url]http://www.cctv.com[/url]
或<a >http://www. blueidea.com</a>.
這個正則的關(guān)鍵就在于匹配鏈接,匹配之后,在兩邊加上a標(biāo)簽和屬性不是問題。
/http:\/\/[\w-]*(\.[\w-]*)+/ig首先匹配http://。
[\w-]*是可能的www和bbs等。
\.[\w-]*匹配.xxx形式,至少有一個。
測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,function(m){return '<a href="'+m+'">'+m+'</a>';})
}
var reg = /http:\/\/[\w-]*(\.[\w-]*)+/ig;
var str = '將一個用戶輸入的一段文字中的url替換成可以點(diǎn)擊的link地址。\
測試一下:http://www.blueidea.com緊接著中文,還有http://bbs.blueidea.com \
is very good!http://blueidea.com!最后在看看帶.cn的:http://www.sina.com.cn呵呵。';
document.write(replaceReg(reg,str)+'<br />');
</script>
從HTML代碼段刪除指定標(biāo)簽極其內(nèi)容
來源:關(guān)于正則的問題
在一段代碼中去除<script ...... /script>, <head>...</head>,<%.....%>等代碼塊
隆的正則:
/<(script|meta|%)[\s\S]*?\/(script|meta|%)>/試了一下,匹配如下文本正常:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
我是要被刪除的腳本
</script>
哎。就剩下我了。但是,如果使用類似的正則:
/<(script|head|%)[\s\S]*?\/(script|head|%)>/ig
匹配有嵌套的標(biāo)簽:
復(fù)制代碼 代碼如下:
<head>
<script type="text/javascript">
我是要被刪除的腳本
</script>
</head>
哎。就剩下我了。實(shí)際匹配的內(nèi)容是:
復(fù)制代碼 代碼如下:
<head>
<script type="text/javascript">
我是要被刪除的腳本
</script>
這是因?yàn)閇\s\S]*?里的非貪婪造成的??梢允褂肑avaScript正則里的反向引用來解決這個問題,如果起始標(biāo)簽匹配了head,那么結(jié)束標(biāo)簽也必須是head。最后的正則如下:
/<(script|head|%)[\s\S]*?\/\1>/ig用正則給文本分段
來源:怎樣用正則分段落
原代碼:[title]標(biāo)題一[/title]內(nèi)容一232323sdfga [title]標(biāo)題二[/title]內(nèi)容二2232323 [title]標(biāo)題三[/title]內(nèi)容三2232323
要把文本分段成如下格式:
一、[title]標(biāo)題一[/title]內(nèi)容一232323sdfga
二、[title]標(biāo)題二[/title]內(nèi)容二2232323
三、[title]標(biāo)題三[/title]內(nèi)容三2232323
只要用正則匹配title就可以了,所以正則比較簡單
/\[title\]/ig
至于開始的的漢字序號,只要一個數(shù)組就解決了,最終代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
var mark =0;
return str.replace(reg,function(m){mark++;return '<br />'+arr[mark]+'、'+m;})
}
var arr = ["零","壹","貳","叁","肆","伍","陸","柒","捌","玖"];
var reg = /\[title\]/ig;
var str = '[title]標(biāo)題一[/title]內(nèi)容一232323sdfga \
[title]標(biāo)題二[/title]內(nèi)容二2232323 [title]標(biāo)題三[/title]內(nèi)容三2232323';
document.write(replaceReg(reg,str)+'<br />');
</script>
轉(zhuǎn)換源代碼中的標(biāo)簽
來源:一個正則上的問題
將代碼中的HTML標(biāo)簽img轉(zhuǎn)換為[img]url[/img]。
/<img(?:\s*\w*?\s*=\s*".+?")*?\s*src\s*=\s*"(.+?)"(?:\s*\w*?\s*=\s*".+?")*\s*>/ig
這段正則和匹配鏈接標(biāo)簽的正則基本一樣,修改如下,標(biāo)簽名img,沒有結(jié)束標(biāo)簽而是>結(jié)束。
測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,'[img]$1[/img]')
}
var reg =
/<img(?:\s*\w*?\s*=\s*".+?")*?\s*src\s*=\s*"(.+?)"(?:\s*\w*?\s*=\s*".+?")*\s*>/ig;
var str = '我就是傳說中的圖片了<img src="URL">哎。';
document.write(replaceReg(reg,str)+'<br />');
</script>
第二個是替換object代碼嵌入的flash代碼替換為
Flash動畫針對原文的正則如下:
/<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i
如果是所有的屬性都有雙引號的話正則也需要修改。
測試如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function replaceReg(reg,str){
return str.replace(reg,'
Flash動畫}
var reg = /<object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*<\/object>/i;
var str = '<object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 \
codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/\
swflash.cab#version=5,0,0,0 width=255 height=250><param name=movie \
value=url><param name=quality value=high><embed src=url quality=high \
pluginspage=http://www.macromedia.com/shockwave/download/index.cgi?\
P1_Prod_Version=ShockwaveFlash type=application/x-shockwave-flash \
width=255 height=250></embed></object>';
document.write(replaceReg(reg,str)+'<br />');
</script>
給屬性添加雙引號
來源:請教正則表達(dá)式高手
給HTML標(biāo)簽中的屬性添加雙引號。
<a href=xxx>改為:<a href="xxx">
LeXRus的第一個正則如下:
/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig第一個括號沒看明白,JS應(yīng)該是不支持。所以我擅自給刪掉了,剩下的正則如下:
/(\s+\w+)\=([^>\"\s]+)/ig第一個括號里的\s+\w+匹配的是屬性名。
然后是=,不用轉(zhuǎn)義。
第二個括號里的[^>\"\s]+匹配屬性值。不匹配>”和空格。這里的引號不用轉(zhuǎn)義。在意思不改變的情況下,稍微改了改,正則如下:
/(\s+\w+)=([^>"\s]+)/ig需要注意的是這個正則不匹配=兩邊有空格的屬性,例如href = xxx。相匹配的話就改成:
/(\s+\w+)\s*=\s*([^>"\s]+)/ig代碼:
str=str.replace(/(?!\<\w+)(\s+\w+)\=([^>\"\s]+)/ig,'$1="$2"');
其中'$1=”$2”'就實(shí)現(xiàn)了給屬性值添加上雙引號。不過ncs指出了這個正則替換的幾個問題,一是上面的空格問題,二是如果非標(biāo)簽內(nèi)部有等號,且前面又恰巧有空白字符的話,它將會被誤識別為屬性,例如:
<a href=xxx target=yyy title = asdfasf> test=sd
里面的test=sd也會被匹配。三是如果屬性原來使用了單引號,會被再包上一層雙引號……
來看看LeXRus前輩的新正則替換方法:
str=str.replace(/(?!<\w+)(\s+\w+)\s*=\s*([^>\"\s]+)(?=[^>]*>)/ig,'$1="$2"')
.replace(/\"\'([^\'\"]+)\'\"/ig,'\"$1\"');先來看第一個正則:
/ (\s+\w+)\s*=\s*([^>"\s]+)(?=[^>]*>)/ig
結(jié)尾新添的(?=[^>]*>)意在解決普通文本中有等號被誤識別為屬性的問題:
<a href=xxx target=yyy title = asdfasf> test=sd
就沒問題了,但是
<a href=xxx target=yyy title = asdfasf> test=sd<tag>又一個標(biāo)簽</tag>
中的test=sd<tag>又會被識別為屬性。
我覺得改成下面的正則就沒問題了:
/(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig
分別在第二個括號的字符集合和最后的反向預(yù)查的字符集合中添加了一個<。
下面再來分析第二個正則,
/\"\'([^\'\"]+)\'\"/ig這個正則用于匹配雙引號,單引號多層嵌套的情況,同樣,不用轉(zhuǎn)義,修改正則如下:
/"'([^'"]*)'"/ig
這樣基本任務(wù)就完成了。測試代碼如下:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function rp(str,trg){
var reg1 = /(\s+\w+)\s*=\s*([^<>"\s]+)(?=[^<>]*>)/ig
var reg2 = /"'([^'"]*)'"/ig;
str=str.replace(reg1,'$1="$2"').replace(reg2,'\"$1\"');
trg.value=str;
}
</script>
<textarea id="sou" style="width:100%">
<a href = xxx name=aaa target=_blank title='asdfasf'
onclick=alert('blueidea')> asfd=asfd
</textarea>
<input type="button" onclick="rp(sou.value,sou)" value="replace"/>
原帖里L(fēng)eXRus又提出了新問題:
hint=i am lexrus
這樣的屬性會有問題,不過我感覺不加引號的話,屬性值里就不可能有空格,否則會被識別為多個屬性了。不過看到最后ncs的回帖我就哭了:
onclick=if(document.forms.length>0)
這樣的屬性怎么辦?大于號會被識別為標(biāo)簽結(jié)束……還是分離行為與文檔吧。補(bǔ)充一下,其實(shí)修補(bǔ)一下正則也可以解決,只要改成如下正則即可:
/(\s+\w+)\s*=\s*([^"\s]+)(?=[^<>]*>)/ig就是去掉第二個括號內(nèi)字符集合里的<>。最后這個問題也解決。
給table加上tbody
來源:通過正則表達(dá)式快速在后加上
有若干table,但是沒有tbody。現(xiàn)在需要用正則批量加上。
匹配table結(jié)束標(biāo)簽</table>比較簡單,在前面加上一個</tbody>就行了。
但是,匹配table的起始標(biāo)簽有點(diǎn)難度,因?yàn)榭赡苡袑傩?。不過之前匹配過鏈接了,這個也大同小異。
實(shí)例table代碼如下:
<table width="100%" border="0" cellpadding="2" cellspacing="3">
<table width="100%">
正則:
/<table\s(\s*\w*?\s*=\s*".+?")*?\s*?>/g匹配一個<table,在匹配若干個屬性,最后只要再找到>就代表標(biāo)簽結(jié)束。
之后再replace一下,加上<tbody>就可以了。
去掉標(biāo)簽的所有屬性
來源:正則表達(dá)式(Dreamweaver8)
<td style="width: 23px; height: 26px;" align="left">***</td>
變成沒有任何屬性的
<td>***</td>
思路:非捕獲匹配屬性,捕獲匹配標(biāo)簽,使用捕獲結(jié)果替換掉字符串。正則如下:
/(<td)\s(?:\s*\w*?\s*=\s*".+?")*?\s*?(>)/首先,td匹配掉了標(biāo)簽,后面可以用$1引用,后面的若干屬性被(?:)匹配掉,而最后匹配的>則可以在后面用$2引用。
示意代碼:
str = str.replace(reg,'$1$2');
正則替換特定單詞
來源:正則表達(dá)式,拒絕幾個單詞的輸入該怎樣表達(dá)?
要求禁止輸入某幾個單詞,如果拒絕red,yellow,white。這個帖子到時不難,但是讓我弄清楚了好幾個概念。
第一個,小心字符集合里的“或”
/[^red|yellow|white]/這個正則里的所有或都沒有意義,等同于:
/[^redyellowwhite]/意思就是不能含有以下列出的所有字母。
正解:
/red|yellow|white/第二個概念:
只要整個正則匹配成功,無論子正則表達(dá)式是否匹配成功,括號都會捕捉。例如
/(red)|(yellow)|(white)/會捕捉到三個結(jié)果,盡管實(shí)際上最多只可能有一個括號匹配成功。但是只要有一個匹配到了,兩外兩個也會記錄空串。
指定文字高亮顯示
來源:如何用正則把網(wǎng)頁中的指定的字高亮顯示
請教正則表達(dá)式:如何替換搜索結(jié)果中的關(guān)鍵字為高亮顯示?
不勞而獲一次,這個子虛烏有前輩已經(jīng)給出了非常好的解決方案:我直接把代碼貼出來了:
復(fù)制代碼 代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<META name="Author" content="Sheneyan" />
<script type="text/javascript">
function encode(s){
return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/([\\\.\*\[\]\(\)\$\^])/g,"\\$1");
}
function decode(s){
return s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g,"$1").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&");
}
function highlight(s){
if (s.length==0){
alert('搜索關(guān)鍵詞未填寫!');
return false;
}
s=encode(s);
var obj=document.getElementsByTagName("body")[0];
var t=obj.innerHTML.replace(/<span\s+class=.?highlight.?>([^<>]*)<\/span>/gi,"$1");
obj.innerHTML=t;
var cnt=loopSearch(s,obj);
t=obj.innerHTML
var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g
t=t.replace(r,"<span class='highlight'>$1</span>");
obj.innerHTML=t;
alert("搜索到關(guān)鍵詞"+cnt+"處")
}
function loopSearch(s,obj){
var cnt=0;
if (obj.nodeType==3){
cnt=replace(s,obj);
return cnt;
}
for (var i=0,c;c=obj.childNodes[i];i++){
if (!c.className||c.className!="highlight")
cnt+=loopSearch(s,c);
}
return cnt;
}
function replace(s,dest){
var r=new RegExp(s,"g");
var tm=null;
var t=dest.nodeValue;
var cnt=0;
if (tm=t.match(r)){
cnt=tm.length;
t=t.replace(r,"{searchHL}"+decode(s)+"{/searchHL}")
dest.nodeValue=t;
}
return cnt;
}
</script>
<style type="text/css">
.highlight{background:green;font-weight:bold;color:white;}
</style>
</head>
<body>
<form onsubmit="highlight(this.s.value);return false;">
<p><input name="s" id="s" title="搜索內(nèi)容:"/><input type="submit" value="搜索"/></p>
</form>
<div id="content">
測試高亮的代碼。很長很長的代碼……………………
</div>
</body>
</html>
刪除標(biāo)簽
來源:如何使用正則表達(dá)式去除大部分HTML標(biāo)記?
刪除除了<img>、<br>、<p>之外所有的標(biāo)簽。子虛烏有給出代碼中關(guān)鍵的一句:
o.innerHTML.replace(/(<\/?(?!br|p|img)[^>\/]*)\/?>/gi,'');
剛開始沒反應(yīng)過來,后來才想起來,這個正則不用區(qū)分起始和結(jié)束標(biāo)簽。
<\/?(?!br|p|img)
匹配除了保護(hù)標(biāo)簽外標(biāo)簽的起始標(biāo)簽或者是結(jié)束標(biāo)簽的一部分。
[^>\/]*
匹配到>或者/就結(jié)束。
\/?>
起始標(biāo)簽或者結(jié)束標(biāo)簽的結(jié)尾。
您可能感興趣的文章:
- 如何確保JavaScript的執(zhí)行順序 之實(shí)戰(zhàn)篇
- Node.js實(shí)戰(zhàn) 建立簡單的Web服務(wù)器
- JBuilder2005實(shí)戰(zhàn)JSP之登錄頁面實(shí)現(xiàn)代碼[圖]
- js調(diào)試系列 斷點(diǎn)與動態(tài)調(diào)試[基礎(chǔ)篇]
- js調(diào)試工具console.log()方法查看js代碼的執(zhí)行情況
- js調(diào)試工具Console命令詳解
- 使用Chrome調(diào)試JavaScript的斷點(diǎn)設(shè)置和調(diào)試技巧
- JavaScript使用DeviceOne開發(fā)實(shí)戰(zhàn)(一) 配置和起步
- JavaScript使用DeviceOne開發(fā)實(shí)戰(zhàn)(二) 生成調(diào)試安裝包
相關(guān)文章
淺析lastIndex對正則表達(dá)式結(jié)果的影響
js中正則表達(dá)式的使用方式有兩種,一種是正則表達(dá)式對象的方法,一種是字符串對象的方法。下面通過本文給大家分享lastIndex對正則表達(dá)式結(jié)果的影響,需要的朋友參考下吧2017-11-11
@Pattern?用于校驗(yàn)字符串是否符合特定正則表達(dá)式的注解
@Pattern注解用于Java中驗(yàn)證字符串格式,通過正則表達(dá)式匹配,它可以應(yīng)用于類屬性、方法參數(shù)和返回值,屬性包括regexp正則表達(dá)式、message錯誤消息和flags匹配標(biāo)志,本文介紹@Pattern用于校驗(yàn)字符串是否符合特定正則表達(dá)式的注解,感興趣的朋友跟隨小編一起看看吧2024-11-11
JavaScript正則表達(dá)式校驗(yàn)非正整數(shù)實(shí)例
本文分享了js正則表達(dá)式(^((-\d+)|(0+))$)校驗(yàn)非正整數(shù)實(shí)例代碼,代碼簡單易懂,需要的朋友可以看下2016-12-12
Javascript lastIndex 正則表達(dá)式的一個疑惑
Javascript lastIndex 正則表達(dá)式2009-01-01


