我需要帮助使用PHP转义javascript函数的字符串参数

时间:2012-07-07 06:10:09

标签: php javascript

我正在动态创建一个调用javascript函数的锚点。它适用于一个字符串参数,但不适用于两个。我相信我没有正确地绕过参数的引号。在寻找答案时,我遇到了以下内容

onclick="alert('<?echo $row['username']?>')"  

我发现的下一个让我完全感到困惑

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>');

如果有人愿意

  1. 解释为什么围绕用户名的单引号不必转义?

  2. 如果有一个“假人”写在逃避角色上,那么我可以尝试破译第二个例子。

5 个答案:

答案 0 :(得分:1)

让我们来看看你的第一个例子

onclick="alert('<?echo $row['username']?>')" 

这里的重要部分是,<? … ?>之外的所有内容都是纯HTML,并且从未被PHP解释器查看过。因此,与PHP相关的唯一部分是<? … ?>内的代码,即echo $row['username']。在这里,人们不需要做任何逃避。

你的第二个例子,相反

echo('<button type="button" id="button'.$ctr.'"onClick="showMapsInfo(\''.str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr).'\');"><img src="img/maps_logo.gif"></button><br/>');

纯粹是用PHP编写的,没有周围的HTML。因此,您必须小心引号。让我们从头开始构建这个,看看这里发生了什么。当你构建这样的东西时,你可能会从

开始
echo('<button type="button" id="button1" onClick="showMapsInfo(\'...\');"><img src="img/maps_logo.gif"></button><br/>');

由于单引号已用作字符串分隔符,因此必须使用\'在字符串内对其进行转义。现在为javascript函数里面的部分。更简单的说,上面的代码归结为

echo('showMapsInfo(\'...\');');

导致

showMapsInfo('...');

当我们想要插入一些动态部分而不是'...'部分时,我们需要使用'结束字符串并将其与.连接在一起。假设你想在那里插入变量$foobar,那么你会写:

echo('showMapsInfo(\''.$foobar.'\');');

导致

showMapsInfo('<VALUE OF $foobar>');

您的示例不会将$foobar插入此字符串,而是插入以下表达式:

str_replace("'", "\\'", $maps_name).'\', \''.str_replace("'", "\\'", $ctr)

使用str_replace以便再次转义内容,但稍微扭曲:它不是为PHP转义的,而是为了生成的Javascript!每个单引号'在输出中成为转义单引号\',但您需要编写\\'因为反斜杠需要自行转义,以便产生反斜杠作为输出。

答案 1 :(得分:1)

您可以替换引号,然后使用heredoc,它更易读,更容易理解。

$maps_name = str_replace("'", "\\'", $maps_name);
$ctr       = str_replace("'", "\\'", $ctr);

echo <<<HTML

<button type="button" id="button$ctr" onClick="showMapsInfo('$maps_name', '$ctr');"><img src="img/maps_logo.gif"></button><br/>

HTML;

答案 2 :(得分:0)

您可以将json_encode函数用于javascript变量。

echo sprintf(
  '<button type="button" id="button%s" onClick="showMapsInfo(%s, %s);">
   <img src="img/maps_logo.gif"></button><br/>',
    htmlspecialchars($ctr), json_encode($maps_name), json_encode($ctr));

答案 3 :(得分:0)

  1. 用户名周围的单引号不必转义,因为它是PHP变量的一部分,而不是JavaScript。

  2. 可以找到有关将PHP变量注入JavaScript的信息here以及更多信息here

    如果变量是字符串,则只需将PHP变量括在引号中。

答案 4 :(得分:0)

我认为您在转发单引号时没有问题,因为当您

时功能正在运行

仅使用一个参数调用它。

检查是否正确创建了整个参数sting,如果正确添加了逗号,并且如果单引号出现在bot的参数中,则在javascript中。

最后参数字符串应该看起来像

'param1','param2'