我正在编写一些使用 PHP 渲染的 JavaScript 代码。如何在我的 PHP 字符串中转义单引号(仅限单引号)?
<script type="text/javascript">
$('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>
简单来说:echo str_replace('\'', '\\\'', $myString);
不过,我建议使用JSON和json_encode()
函数,因为它更加可靠(可以处理引号和换行符等):
<?php $data = array('myString' => '...'); ?>
<script>
var phpData = <?php echo json_encode($data) ?>;
alert(phpData.myString);
</script>
str_replace("'","\\'", $string)
和类似方法的答案都是错误的。考虑字符串',它将被替换为\',这会导致注入漏洞。相反,请像Crozin建议的那样使用json_encode。 - David M.JSON.parse('<?php echo json_encode($data);?>');
,但是失败了,因为数据中有一个单引号。后来我知道在这里不需要使用JSON.parse
。 - Ravi Dhoriya ツ如果你想要用 \
转义字符,可以使用 addcslashes()
函数。例如,如果你只想转义单引号,像这个问题一样,可以做如下操作:
echo addcslashes($value, "'");
如果您想要转义特殊字符 '
, "
, \
和字节空值 nul
,您可以使用 addslashes()
函数:
echo addslashes($value);
str_replace("'", "\'", $mystringWithSingleQuotes);
在某些情况下,我只是将其转换为实体:
// i.e., $x= ABC\DEFGH'IJKL
$x = str_ireplace("'", "'", $x);
$x = str_ireplace("\\", "\", $x);
$x = str_ireplace('"', """, $x);
在 HTML 页面上,视觉输出是相同的:ABC\DEFGH'IJKL
然而,在源代码中已经进行了消毒处理。
使用本地函数htmlspecialchars
。它会转义所有特殊字符。如果你想要特别转义引号,可以结合使用ENT_COMPAT
或 ENT_QUOTES
。以下是示例:
$str = "Jane & 'Tarzan'";
echo htmlspecialchars($str, ENT_COMPAT); // Will only convert double quotes
echo "<br>";
echo htmlspecialchars($str, ENT_QUOTES); // Converts double and single quotes
echo "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES); // Does not convert any quotes
输出结果将会像这样:Jane & 'Tarzan'<br>
Jane & 'Tarzan'<br>
Jane & 'Tarzan'
阅读更多关于PHP htmlspecialchars() 函数的内容
要仅替换单引号,请使用此简单语句:
$string = str_replace("'", "\\'", $string);
经过长时间的问题解决,我认为我找到了更好的解决方案。
将两个函数结合起来使用可以使字符串转义以用作 HTML。
第一个函数是为了在 JavaScript 函数调用中转义双引号;第二个函数是为了转义单引号,避免这些单引号围绕参数。
解决方案:
mysql_real_escape_string(htmlspecialchars($string))
解决方案:
请注意,此处的HTML标签保留不变。echo 'onclick="javascript_function(\'' . mysql_real_escape_string(htmlspecialchars($string))
function escapePhpString($target) {
$replacements = array(
"'" => '\\\'',
"\\" => '\\\\'
);
return strtr($target, $replacements);
}
/**
* With new line replacements too
*/
function escapePhpString($target) {
$replacements = array(
"'" => '\\\'',
"\\" => '\\\\',
"\r\n" => "\\r\\n",
"\n" => "\\n"
);
return strtr($target, $replacements);
}
我不确定你在处理数据方面具体在做什么,但你可以尝试:
$string = str_replace("'", "%27", $string);
每当将字符串发送到数据库进行存储时,我都会使用它。
%27是'字符的编码,如果一个字符串中包含单个'
字符,它还有助于防止GET请求的中断。我会在JavaScript和PHP中用%27替换',以防有人试图手动向您的PHP函数发送一些数据。
为了使最终用户更美观,只需对从服务器返回的所有数据运行反向替换函数,并将所有%27子字符串替换为'
。
避免注入攻击,祝愉快!
addcslashes($mystringWithSingleQuotes, "'\"\r\n\\\t\0..\37")
这样的代码来实现。 - Frank Farmerjson_encode()
来获取有效的 Javascript 字符串(并删除外部单引号)。 - mario.html()
中直接使用双引号而不用单引号包装?无论如何,PHP 扩展都会发生。我一直在做这个,从元素属性和导入到脚本块内的变量赋值。 - Mark Carpenter Jr