string.replace()with global(g)不能以奇怪的方式工作

时间:2014-04-26 21:56:58

标签: javascript jquery regex wordpress replace

我正在尝试使用javaScript的.replace函数替换字符串中的方括号,但它不起作用。我的代码:

var str = document.getElementById('string-input-field').value;
str = str.replace(/[/g, '[').replace(/]/g, ']');

奇怪的是,它没有给出任何错误,而是替换[和]它只替换了几个字母。例如,如果我试试这个:

var str = 'abcdefghijklmnopqrstuvwxyz';
str = str.replace(/[/g, '6').replace(/]/g, '6');

我得到'6b6d6f6hijk6mno6q6stuvwxyz'。所以字母表'a c e g l p r'正在被替换。此外,我尝试将变量设置为一个简单的字符串,如上所述,并通过从输入字段获取值,但仍然是同样的问题。

请让我知道什么是错的,或者如果有任何其他方式我可以达到同样的目的。

聚苯乙烯。我正在使用localhost,这个页面正在加载到Wordpress的管理区域(post.php - 编辑页面)。

更新

在@ p.s.w.g回答后我尝试了以下内容:

str = 'aaaaa[bbbbbb]ccccc';
str = str.replace(/\[/g, '[').replace(/]/g, ']');

我得到同样的回报:aaaaa [bbbbbb] ccccc。然而,旧问题已经解决,如@ p.s.w.g所说。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

[是正则表达式中的一个特殊字符,它开始一个字符类,一直持续到遇到]。解析器将所有[/g, '6').replace(/]视为字符类。字符类将匹配任何字符(或括号内指定的字符范围。在这种情况下,这意味着任何/g,(空格​​),'6).replac(,角色。

尝试像这样转义[字符(请注意,没有必要转义],因为它不是特殊字符,除非它是字符类的一部分):

str = str.replace(/\[/g, '[').replace(/]/g, ']');

例如:

var str = "[foo] [bar]";
str = str.replace(/\[/g, '[').replace(/]/g, ']');
console.log(str); // "[foo] [bar]"

关于您的更新,您使用的任何工具都可以将[]静默转换回[]。如果是这种情况,您可能还想逃避&以避免这种情况:

str = str.replace(/\[/g, '[').replace(/]/g, ']');

但是在其他情况下这可能会崩溃,使用这样的替换方法可能会更好:

str = str.replace(/\[|]/g, function(c) { 
    return '&#' + c.charCodeAt(0) + ';' 
});