JavaScript中的正規表示式在不同的瀏覽器中得到的結果可能會有差異,下面把正規表示式在五大主流瀏覽器(IE、Firefox、Chrome、Safari、Opera,以當前版本為準)之間的差異整理一下羅列出來。
1. Firefox和Chrome會過度優化在循環(以及其中內嵌的函數定義)中創建的正則表達式,似乎它們在假設寫JavaScript的人會把正則表達式的構建和賦值寫錯地方。
var r; for(var i = 0; i < 2; i++){ var x = /abc/g; if(r) // 第二个循环时Firefox和Chrome会输出“true” document.write(r == x); else r = x; }
2. 如果你把一個有可能什麼也不返回的函數作為第二個參數傳遞給replace方法,那麼IE可能會直接刪除匹配的文本(在之前的測試中我總結的是Opera的行為比較獨特,現在看起來似乎是錯誤的結論),而其它瀏覽器則是會將匹配的文本替換成“undefined”。
// IE会输出“13”,而其它浏览器输出“1undefined3” document.write('123'.replace(/2/, function(){}));
3. 如果使用new RegExp的形式建立正規表示式時使用一個已有的正規表示式實例作為參數,那麼大部分瀏覽器都會建立一個基本功能相同,但完全獨立的、全新的正規表示式實例;而Safari則會很乾脆地傳回那個作為參數的正規表示式實例。
var r = /1/; // Safari会输出“true”,而其它浏览器输出为“false” document.write(new RegExp(r) == r);
4. 如果把一個“空”的正則表達式直接轉換成字串,IE以外的瀏覽器都會得到“/(?:)/”,而IE會得到“//”——但從正則表達式上直接提取source屬性的時候,得到的都是空字串。
// IE输出“//”,其它浏览器输出“/(?:)/” document.write(new RegExp('')); // IE输出“undefined”,其它浏览器输出“/(?:)/” document.write(eval('' + new RegExp('')))
5. 如果把一個包含斜線“/”的正規表示式直接轉換成字串-以“new RegExp('/')”為例,只有Firefox和Opera會得到“///”,並且直接提取source屬性會得到“/”;而其它瀏覽器則會得到“///”,並且直接提取source屬性會得到“/”。
// Firefox和Opera输出“/\//”,其它浏览器输出“///” document.write(new RegExp('/')); // Firefox和Opera输出“/\//”,其它浏览器输出“undefined” document.write(eval('' + new RegExp('/')))
6. 如果在使用字面表達式來定義一個正則表達式時,使用了無效的選項標誌(例如“/abc/n”),則Chrome和Safari會完全忽視此無效選項標誌(等同於“ /abc/”),而在其它瀏覽器會導致語法錯誤。
// Chrome和Safari会输出“/abc/”,其它浏览器中产生语法错误 document.write(/abc/n);
7. 如果透過建構器來建立正規表示式時,為其指定選項標誌的(第二個)字串參數中包含了非有效標誌的字符,在Firefox中就會引起一個異常,而其它瀏覽器會將無效的部分忽略。
// Firefox中会引起一个异常,提示无效的标志;而其它浏览器会输出“/1/ document.write(new RegExp('1', 'n')); ”
以上就是JavaScript正規表示式的瀏覽器的差異 的內容,更多相關內容請關注PHP中文網(www.php.cn)!