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 执行成功)但是当我在网页中显示它们时我无法驾驭它们。

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_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/ zh/function.htmlspecialchars.php

于 2013-02-06T00:04:17.027 回答
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>
于 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 回答