2016-12-12 43 views
5

我想用%20替换字符串中的句点,以实现Firebase密钥用途。如何在JavaScript中不使用/ g替换字符串中的所有句点?

string.replace('.', '%20') 

我甚至可以做所有的人都用/g正则表达式标志:

string.replace(/\./g, '%20') 

但火力地堡规则给我一个错误:

Error saving rules - Line 5: regular expressions do not support flags other than i

我可以用时间做1期

所以我需要一个表达式来替换所有的时期而不使用/g。我可能只是连锁.replace('.', '%20')一堆时间:

string.replace('.', '%20').replace('.', '%20').replace('.', '%20').replace('.', '%20') 

但我希望有一个更好的办法。

更新:我曾试图string.split('.').join('%20'),但火力地堡引发错误:

Type error: Function call on target that is not a function.

我猜他们在JSON规则分析器拿出split功能。我也尝试过(function() {var s = auth.token.email; while (s.indexOf('.') != -1) { s = s.replace('.', '%20') } return s})()。 Firebase抱怨说他们的数据库规则中不允许使用函数定义。

更新3:由于火力地堡的精彩的支持,我发现,在他们的数据库规则string.replace功能已经取代与替换所有出现的串的,不只是一个单一的发生一个版本。所以实际string.replace('.', %2E')完美的作品!

+0

我发现的唯一参考是这[Github问题](https://github.com/firebase/bolt/issues/176)... – Xufox

+0

是@Xufox这就是我正在处理的问题 –

+0

如果你正在计划使用电子邮件地址作为密钥,有更好的选择来构建你的数据,这样就可以完全避免这种混乱。只是在说'。 – Jay

回答

9

你只能分割和重新加入它string.split('.').join('%20')

+1

Plus1,以便省却我输入完全相同的东西:D – Archer

+1

这很优雅!我的第一个想法是用'(/./).test(string)'或类似条件的while循环。 – Xufox

+0

刚发布了一个更新,我尝试了这个,但Firebase给了我一个错误。尽管这是对我的问题的一个很好的回答。 –

0

由于火力地堡是抱怨时,你也试试分裂的明显更好的答案,然后加入,试试这个...

var s = "this.is.a.string.value"; 
 

 
while (s.indexOf(".") != -1) { 
 
    s = s.replace(".", "%20"); 
 
} 
 

 
console.log(s);

+0

我可以尝试将其作为表达式或IIFE进行包装 –

+0

是的,您知道上下文,因此您可以决定使用它的最佳方式。如果您可以在Firebase中创建函数原型,那么这可能是一个解决方案,如果您不止一次需要它。 – Archer

+0

不幸的是,Firebase给出了一个错误,数据库规则中不允许使用函数定义:( –

相关问题