在IE7 | 8中使用特殊替换模式替换字符串的奇怪行为

时间:2013-05-27 13:32:27

标签: javascript regex internet-explorer-8 internet-explorer-7

在使用特殊替换模式时,我在IE7 | 8中发现了一个非常奇怪的问题:

'moo$$e'.replace( /\$/g, '$$$$' );
'moo$$e'.replace( '\$', '$$$$', 'g' );   

最新Chrome:

 moo$$$$e moo$$$e

最新的Firefox:

 moo$$$$e moo$$$$e

IE7 | 8:

 moo$$$$e moo$$$$$e

我知道flags parameter is nothing like a standard,因此在第二种情况下Firefox和Chrome之间存在差异。 我很酷#/ strong>。

然而,我在IE7 | 8中看到的真的很奇怪(还是第二种情况)。我尝试使用'\x24',逃避和填充,但我找不到任何方法让它按预期工作($$代表$)。

我知道这可以通过split()join()轻松完成,例如:

'moo$$e'.split( '$' ).join( '$$' );
> "moo$$$$e"

但我真的非常好奇IE的错误。有没有解释?

请参阅live example

1 个答案:

答案 0 :(得分:3)

测试用例

我重新审视了test case并将结果显示如下:

var results = [
  'YY'.replace( /Y/g, '$$' ),
  'YY'.replace( 'Y', '$$', 'g' ),
  'YY'.replace( 'Y', function( a, b ) { return '$$'; }, 'g' ),
  'YY'.replace( /Y/g, function( a, b ) { return '$$'; })  
];

console.log( results.join( '\n' ) );

结果

$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$Y    // '$$' -> '$', global flag ignored, first 'Y' -> '$'
$$Y   // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'

火狐

$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'

IE7和8

$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$$Y   // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$Y   // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'

结论

  1. flags used this way don't belong to any standard以来,Chrome会将'g'标记忽略为String.replace的第三个参数。

  2. IE假设$$是字符串而不是替换控件,在这种情况下忽略全局标志:

    'YY'.replace( 'Y', '$$', 'g' );

  3. 最简单的解决方案是确保结果总是相同的是使用带有标志(RegExp)的/foo/flags对象作为第一个参数,使用字符串或函数作为第二个参数。

    如果字符串是第二个参数,$$会转换为$。如果这是一个功能驱动的替代品,则没有这样的转换。