javascript - 使用 RegEx 进行 JavaScript 字符串参数编码

标签 javascript regex vb.net string

摘要

能否使用正则表达式来匹配多个字符,但用特定的替换来替换单个字符。

例如,将 \ 替换为 \\,将 " 替换为 \x22,然后替换 '\x27

据我所知,这是不可能的,因为您可以在表达式中使用捕获的子匹配,但不能使用任何级别的逻辑来允许您在发生子匹配时有条件地输出文本。

下面的 VB.NET 代码显然完全不正确,但可以让您了解我的想法...(即,如果有一个替换命令允许您说“如果子匹配 1 发生,则改为输出 \\")

RegEx.Replace(text, "(\)?("")?(')?", "{if($1,'\\')}{if($2,'\x22')}{if($2,'\x27')}")

(这适用于 .NET RegEx 类,但对于 javascript RegExp 类使用也很有用)

背景

更多的是出于兴趣而不是实际需要,但我一直在玩编码文本以便在 javascript 参数中使用。 (嗯,需求肯定是存在的,但兴趣在于效率。)

我一直在使用标准的String.Replace,并使用以下两个函数进行一些性能测试...

Public Function GetJSSafeString(ByVal text As String) As String
    Return text.Replace("\", "\\").Replace("""", "\x22").Replace("'", "\x27")
End Function
Public Function GetJSSafeString2(ByVal text As String) As String
    If text.Contains("\") Then
        text = text.Replace("\", "\\")
    End If
    If text.Contains("""") Then
        text = text.Replace("""", "\x22")
    End If
    If text.Contains("'") Then
        text = text.Replace("'", "\x27")
    End If
    Return text
End Function

使用两个字符串,长度均约为 200 个字符 - 第一个不包含任何要转换的字符 - 第二个包含要转换的每个字符之一 (\"')。我跑了两个字符串分别通过两个函数 100000 次。

四个结果(以总毫秒为单位)大致如下...

GetJSSafeString, no converted characters: 182.0364
GetJSSafeString, converted characters: 316.0632

GetJSSafeString2, no converted characters: 60.012
GetJSSafeString2, converted characters: 354.0708

很明显,如果没有替换,GetJSSafeString2 是最好的,如果有字符需要转换,则最差(但也没有差太多,所以看起来是更好的选择)。

但这让我想到......这可以用一个正则表达式来完成吗?

如果是这样,它会比上述两个函数更快吗?

最佳答案

JavaScript 中的解决方案:

var text="this is a test \\ with \"things\" to ' replace";
var h={'\\':'\\\\', '"':"\\x22", "'":"\\x27"}; //we define here the replacements
text=text.replace(/("|\\|')/g,function(match){return h[match]});
alert(text); //prints: this is a test \\ with \x22things\x22 to \x27 replace

关于javascript - 使用 RegEx 进行 JavaScript 字符串参数编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154783/

相关文章:

javascript - 如何将用逗号替换点的数字从字符串转换回十进制数字

javascript - 如何编写一个模块来处理 ExpressJS session ?

javascript - 正则表达式 JavaScript 多行组匹配仅返回 node.js 中预期结果的一部分

regex - Haskell 正则表达式非捕获组

vb.net - 如何在 VB.net 中使用 GetTempPath

javascript - 当循环内的 if 子句中断时,在函数中返回 false

javascript - 无法设置未定义或空引用的属性 'innerText'

正则表达式查找字符串,不包括评论

asp.net-mvc - MVC 授权属性拒绝

jquery - 使用动画 vb.net 滚动到页面底部