如何在javascript中转义html /特殊字符串

时间:2013-02-05 23:58:40

标签: php javascript escaping html-escape-characters

我有一个需要打印一些文本的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成功执行)但是当我在网页上显示它们时,我无法获取它们。

3 个答案:

答案 0 :(得分:3)

执行此操作的最佳方法是使用json_encode对值进行编码。这是一个简单的例子:

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

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

这可以用于整数,字符串和其他值。请记住,它会根据需要添加引号,因此您需要组合并编码“整个值”。在使用URL的示例中,您需要使用PHP urlencode()函数对它们进行FIRST编码,然后将其传递给json_encode以转换为javascript值。如果您将其放在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/en/function.htmlspecialchars.php

答案 1 :(得分:1)

由于可读性和未来可维护性的考虑,我想指出一些可能对您有帮助的事情。

首先,我看到你在PHP字符串中生成HTML元素。这本身并不坏,但是当你的字符串包含2行或更多行时,管理变得越来越困难。相反,您可能想要考虑转义PHP以输出HTML部分,并重新输入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>

答案 2 :(得分: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;
';