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

等しいまま:

を使用して、 内でのみinvertと多かれ少なかれ同じままにします。\HTMLBody

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

\var を中に入れたいのですが、関数内HTMLBody\あるものだけを引用符で囲むことはできませんHTMLBodyvar

機能は何invertですか? 正規表現を使用していますか?

4

1 に答える 1

0

スニペットは少なくとも部分的に PHP から生成されたものであると述べたので、結果を後で修正しようとするよりも、スニペットが適切に生成されるようにそのコードを修正する方が正直なところ良いでしょう。

[編集] たとえば、次のように開始した場合:

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

json_encode()それぞれ次$argumentのことができますarray_map()

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

次に、 と を結合し、$functionNameもう一度$encodedArgsJSON としてエンコードしてString、コードのリテラルを生成します。

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

これはecho次のようにする必要があります ( demo ):

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

コメントの例では、開始値は次のようになります。

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

結果は ( demo ):

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



正規表現でこれを実現するには、文字列をある程度正規化する必要があります。

したがって、エスケープされていない引用符が多すぎるにもかかわらずfunction、単一のString引数を持つ呼び出しの形式に常に従う場合:

functionName (" stringValue ");

注: 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 === '");'

次に、2 番目の RegExp は単純に中間グループ を検索し、subそれらの前に"a を配置\します。

また、invert既に存在し、別の目的を果たしている場合は、必要に応じてこの関数の名前を変更します。

于 2013-07-29T04:26:25.843 に答える