不用多言,這種技術被廣泛應用於表單驗證,文法高亮和危險字元過濾中。一段話如果很長,如果不想像下面那樣替換,我們得想些辦法了。
str = str.replace( /&(?!#?\w+;)/g , '&').replace( /"([^"]*)"/g , '“$1”' ).replace( /</g , '<' ).replace( />/g , '>' ).replace( /…/g , '…' ).replace( /“/g , '“' ).replace( /”/g , '”' ).replace( /‘/g , '‘' ).replace( /’/g , '’' ).replace( /—/g , '—' ).replace( /–/g , '–' );
上面這個還算短了,我看過一些論壇的JS代碼,在把Wind Code轉換成HTML時,那真是瘋子似的寫上二三十行。其實我們大可以把這些匹配模式與替換後的字元放到一個雜湊中,然後一口氣替換掉。
var hash = {'<' : '<' ,'>' : '>','…' : '…','“' : '“' ,'”' : '”' ,'‘' : '‘' ,'’' : '’' ,'—' : '—','–' : '–'};str = str.replace( /&(?!#?\w+;)/g , '&' ).replace( /"([^"]*)"/g , '“$1”' ).replace( /[<>…“”‘’—–]/g , function ( $0 ) {return hash[ $0 ];});
但這個缺陷也很明顯,如雜湊的鍵必須是簡單的一般字元串,不能是複雜正則,這就是我們不得不分開的原因。replace在老一點的瀏覽器是不支援function的。為此,我們只好放棄上面最後那個replace方式,替換方統一為一般字元串。
String.prototype.multiReplace = function ( hash ) {var str = this, key;for ( key in hash ) {if ( Object.prototype.hasOwnProperty.call( hash, key ) ) {str = str.replace( new RegExp( key, 'g' ), hash[ key ] );}}return str;};
Object.prototype.hasOwnProperty.call( hash, key )是用來過濾繼承自原型的方法與屬性的。這樣一來,使用就簡單了:
str = str.multiReplace({'&(?!#?\\w+;)' :'&','"([^"]*)" : '“$1”','<' : '<' ,'>' : '>','…' : '…','“' : '“' ,'”' : '”' ,'‘' : '‘' ,'’' : '’' ,'—' : '—','–' : '–'});