我正在动态创建一个调用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/>');
如果有人愿意
解释为什么围绕用户名的单引号不必转义?
如果有一个“假人”写在逃避角色上,那么我可以尝试破译第二个例子。
答案 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)
答案 4 :(得分:0)
我认为您在转发单引号时没有问题,因为当您
时功能正在运行仅使用一个参数调用它。
检查是否正确创建了整个参数sting,如果正确添加了逗号,并且如果单引号出现在bot的参数中,则在javascript中。
最后参数字符串应该看起来像
'param1','param2'