1

テキストを印刷する必要があるphp / javascriptスクリプトがあります。残念ながら、文字列に次のような特殊文字が含まれていると、js が壊れているようです。

'

以下は、スクリプトのスニペットです。$messageContent と $subject は、html タグ付きの文字列です。(実際には「'」文字) .

echo ' <script language="javascript"> function SelectRedirect(){ switch(document.getElementById(\'s1\').value) { '; echo ' case "?vrj_name='.$vrj_name.'": window.location="?vrj_name='.$vrj_name.'&messageContent='.$messageContent_vrj.'&from_email='.$from_email.'&email='.$email.'&subject='.$subject.'"; break; '; }

「'」を「\'」に置き換える関数をphpに追加しましたが、機能します(jsは正常に実行されます)が、Webページに表示すると乗り物に乗ることができません。

4

3 に答える 3

3

これを行う最善の方法は、 を使用して値をエンコードすることですjson_encode。以下に簡単な例を示します。

<?php
$name = "Jason's Bakery";

?>
<script>
   var name = <?php echo json_encode($name); ?>;
   DoSomethingWithName(name);
</script>

これは、整数、文字列、およびその他の値に使用できます。必要に応じて引用符が追加されるため、「一度に値全体」を組み立ててエンコードする必要があることに注意してください。URLを使用する例では、PHPurlencode()関数を使用して最初にエンコードし、それを渡してjson_encodejavascript値に変換する必要があります。のように HTML 属性の中に配置する場合は、onclickさらにそれを通過させてからhtmlspecialchars(..., ENT_QUOTES)、二重引用符で囲む必要があります。

http://php.net/manual/en/function.json-encode.php

たとえば、PHP で URL を作成し、それを JavaScript で使用する必要があります...

<?php
$name = "Jason's \"Awesome\" Bakery";
$url = "http://site.com/page.php?name=" . urlencode($name);

?>
<script>
   var name = <?php echo json_encode($name); ?>;
   DoSomethingWithName(name);
</script>

<input type="button" onclick="<?php echo htmlspecialchars('window.location = ' . json_encode($url) . ';', ENT_QUOTES); ?>" value="Click Me" />

次のような結果になります。

<script>
   var name = "Jason's \"Awesome\" Bakery";
   DoSomethingWithName(name);
</script>

<input type="button" onclick="window.location = &quot;http:\/\/site.com\/page.php?name=Jason%27s+%22Awesome%22+Bakery&quot;;" value="Click Me" />

言うまでもなく、これらなしではやりたくありません。

http://php.net/manual/en/function.json-encode.php
http://www.php.net/manual/en/function.urlencode.php
http://www.php.net/manual/ ja/function.htmlspecialchars.php

于 2013-02-06T00:04:17.027 に答える
1

可読性と将来の保守性を考慮して、役立つかもしれないいくつかの点を指摘したいと思います。

まず、PHP 文字列で HTML 要素を生成していることがわかります。これは本質的に悪いことではありませんが、文字列が 2 行以上にまたがると、管理がますます難しくなります。代わりに、HTML 部分を出力するために PHP をエスケープし、論理部分のために PHP を再入力することを検討することをお勧めします。PHP をエスケープして、if ステートメントや関数宣言などの中で HTML を入力できるので、そうしない正当な理由はありません。次の例を見てください (このソリューションでは、値に一重引用符、二重引用符、または改行を含めることができる適切な方法で文字列をエスケープすることもできます)。

<?php

function urlFriendly($input) {
    return urlencode($input);
}

function jsFriendly($input, $urlFriendly = True) {
    $output = htmlentities($input, ENT_QUOTES);
    // Double quotes in PHP translate "\n" to a newline.
    // Single quotes in PHP keep the literal value.
    $output = str_replace("\r\n", '\n', $output); // Windows support
    $output = str_replace("\n", '\n', $output); // Linux support
    if($urlFriendly) { // Encode for use in URLs
      $output = urlFriendly($output);
    }
    return $output;
}

$vrj_name = 'vrj';
$messageContent_vrj = 'message content';
$from_email = 'from email';
$email = 'email';
$subject = 'subject line';

?>
<script type="text/javascript">
    function SelectRedirect() {
    switch(document.getElementById('s1').value) {
        case '?vrj_name=<?php print jsFriendly($vrj_name);?>':
            var toloc = '?vrj_name=<?php print jsFriendly($vrj_name);?>';
            toloc    += '&messageContent=<?php print jsFriendly($messageContent_vrj);?>'';
            toloc    += '&from_email=<?php print jsFriendly($from_email);?>';
            toloc    += '&email=<?php print jsFriendly($email);?>';
            toloc    += '&subject=<?php print jsFriendly($subject);?>';
            window.location = toloc;
            break;
    }
</script>
于 2013-02-06T00:22:11.407 に答える
0

そのように

$escaped_string = addslashes($unescaped_string);

前か

$messageContent = addslashes($messageContent);
$subject = addslashes($subject);

またはインライン

echo '
case "?vrj_name='.$vrj_name.'":
window.location="?vrj_name='.$vrj_name.'&messageContent='.addslashes($messageContent).'&from_email='.$from_email.'&email='.$email.'&subject='.addslashes($subject).'";
break;
';
于 2013-02-06T00:14:44.733 に答える