0

我正在动态创建一个调用 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. 在转义字符上写有“假人”的地方,因此我可以尝试破译第二个示例。

4

5 回答 5

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 转义的!每个单'引号在输出中都会变成一个转义的单引号\',但是您需要编写\\',因为反斜杠需要自行转义,以便生成反斜杠作为输出。

于 2012-07-07T06:28:46.177 回答
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;
于 2012-07-07T06:29:41.240 回答
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));
于 2012-07-07T06:19:24.873 回答
0
  1. 用户名周围的单引号不必转义,因为它是 PHP 变量的一部分,而不是 JavaScript。

  2. 可以在此处找到有关将 PHP 变量注入 JavaScript 的信息,并在此处找到更多信息。

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

于 2012-07-07T06:22:15.200 回答
0

我认为您在转义单引号时没有问题,因为该功能在您工作时正在工作

仅使用一个参数调用它。

检查您是否正确地创建了整个参数字符串,是否正确添加了逗号,如果单引号出现在 bot 参数周围,则在 javascript 中。

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

“参数 1”、“参数 2”

于 2012-07-07T06:25:45.840 回答