-4
var = invert ('HTMLBody ("Love"s ");');

保持等于:

使用invert, 保持或多或少相同,\仅在HTMLBody:

var = invert ('HTMLBody ("Love\"s ");');

我想把\var 放在里面,并且不能在引号函数中只HTMLBody\你在函数里面的HTMLBody东西var

功能是什么invert?使用正则表达式?

4

1 回答 1

0

由于您已经声明该代码段至少部分是从 PHP 生成的,因此老实说,您最好修复该代码,以便正确生成代码段,而不是在事后尝试修复结果。

[编辑]例如,如果您从以下内容开始:

$functionName = 'HTMLBody';
$arguments = array('Love"s ');

您可以json_encode()分别$argument使用array_map()

$encodedArgs = array_map('json_encode', $arguments);

然后,结合$functionNameand $encodedArgs,并再次编码为 JSON 以生成String代码的文字:

echo json_encode( $functionName . '( ' . implode(', ', $encodedArgs) . ' )' );

这应该echo如下(演示):

"HTMLBody( \"Love\\\"s \" );"

对于您评论中的示例,起始值为:

$functionName = 'functionjsalert';
$arguments = array('type"s" here', 'value"s here');

这应该导致(演示):

"functionjsalert( \"type\\\"s\\\" here\", \"value\\\"s here\" )"



要使用正则表达式完成此操作,字符串应该有点规则

因此,如果它始终遵循function带有单个String参数的调用格式,尽管有太多未转义的引号:

函数名(“字符串值”);

注意:如果Stringof 代码包含多个参数,则这是不可能的。没有可靠的方法来识别 a 何时"是值的一部分或应该分隔一个值。

但是,以下应该有效:

function invert(snippet) {
    return snippet.replace(/(\w+\s*\(\s*\")(.*?)(\"\s*\)\s*;)/, function (_, pre, sub, post) {
        return pre + sub.replace(/(")/g, '\\$1') + post;
    });
}

var result = invert('HTMLBody ("Love"s ");');

console.log(result); // HTMLBody ("Love\"s ")

第一个 RegExp 匹配 3 个单独的部分:

  • (\w+\s*\(\s*\")匹配函数名、左括号和第一个双引号

    pre === 'HTMLBody ("'

  • (.*?)匹配上一组和下一组之间的任何内容

    sub === 'Love"s '

  • (\"\s*\)\s*;)匹配最后一个双引号、右括号和分号

    post === '");'

然后第二个正则表达式简单地在中间组 , 中搜索sub任何"并在它们之前放置 a \

并且,如果invert已经存在并用于其他目的,请根据需要重命名此函数。

于 2013-07-29T04:26:25.843 回答