之前寫過過一篇關於 Replace()函數的使用的文章,並用它實現了搜尋索引鍵高亮的效果。但沒有很具體地介紹這個函數,這裡補全一下。
replace() 方法的參數 replacement 可以是函數而不是字串。在這種情況下,每個匹配都調用該函數,它返回的字串將作為替換文本使用。該函數的第一個參數是匹配模式的字串。接下來的參數是與模式中的子運算式匹配的字串,可以有 0 個或多個這樣的參數。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置。最後一個參數是 stringObject 本身。
下面展示了幾種javascript正則表示式的repalce方式,有些方式我們很少在別的地方看到,如第二種和第三方中方法。
//下面的例子用來擷取url的兩個參數,並返回urlRewrite之前的真實Urlvar reg = new RegExp("(http://www.bkjia.com/BookReader/)(\\d+),(\\d+).aspx","gmi");var url="http://www.bkjia.com/BookReader/1017141,20361055.aspx";//方式一,最簡單常用的方式var rep = url.replace(reg,"$1ShowBook.aspx?bookId=$2&chapterId=$3");alert(rep);//方式二 ,採用固定參數的回呼函數var rep2 = url.replace(reg,function(m,p1,p2,p3){return p1+"ShowBook.aspx?bookId="+p3+"&chapterId="+p3});alert(rep2);//方式三,採用非固定參數的回呼函數var rep3 = url.replace(reg,function(){var args=arguments; return args[1]+"ShowBook.aspx?bookId="+args[2]+"&chapterId="+args[3];});alert(rep3);//方法四//方式四和方法三很類似, 除了返回替換後的字串外,還可以單獨擷取參數var bookId;var chapterId;function capText(){ var args = arguments; bookId = args[2]; chapterId = args[3]; return args[1]+"ShowBook.aspx?bookId = "+args[2]+"&chapterId="+args[3];}var rep4 = url.replace(reg,capText);alert(rep4);alert(bookId);alert(chapterId);//除了使用replace方法擷取正則表示式的分組外,還可以使用test ,exec方法擷取分組,只是手法有所不同而已var reg2 = new RegExp("(http://www.bkjia.com/BookReader/)(\\d+),(\\d+).aspx","gmi");var m = reg2.exec("http://www.bkjia.com/BookReader/1017141,20361055.aspx");var s="";//擷取所有的分組for (i = 0; i < m.length; i++) { s = s + m[i] + "\n"; }alert(s);bookId = m[2];chapterId = m[3];alert(bookId);alert(chapterId);//使用test方法擷取分組var reg3 = new RegExp("(http://www.bkjia.com/BookReader/)(\\d+),(\\d+).aspx","gmi");reg3.test("http://www.bkjia.com/BookReader/1017141,20361055.aspx");//擷取三個分組alert(RegExp.$1); alert(RegExp.$2);alert(RegExp.$3);var str="www.bkjia.com"; //str.format("好","q") str.replace(new RegExp("(\\.)(bai)du","g"),function(){ for(var i=0; i<arguments.length; i++) { document.write(arguments[i]+"<br/ >"); } document.write("-------------------------------------------------<br/>"); });
兩個例子證明,replace傳入正則參數和字元傳參數結果不同:
alert("123".replace("1",function(){var un;return un;})); //彈出undefined23alert("123".replace(new RegExp("1"),function(){var un;return un;})); //彈出23