如何仅转义单引号?

83

我正在编写一些使用 PHP 渲染的 JavaScript 代码。如何在我的 PHP 字符串中转义单引号(仅限单引号)?

<script type="text/javascript">
    $('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>

8
你需要转义的不仅仅是单引号,还包括换行符等。你可以使用 addcslashes($mystringWithSingleQuotes, "'\"\r\n\\\t\0..\37") 这样的代码来实现。 - Frank Farmer
2
不要自己处理转义,使用 json_encode() 来获取有效的 Javascript 字符串(并删除外部单引号)。 - mario
1
@Frank:你能把你的回答发表为一个答案而不是评论吗?在评论中发布正确的答案无法被选择,因此会产生虚假的“未回答问题”。 - Sylverdrag
为什么不能在 .html() 中直接使用双引号而不用单引号包装?无论如何,PHP 扩展都会发生。我一直在做这个,从元素属性和导入到脚本块内的变量赋值。 - Mark Carpenter Jr
11个回答

69

简单来说:echo str_replace('\'', '\\\'', $myString); 不过,我建议使用JSONjson_encode()函数,因为它更加可靠(可以处理引号和换行符等):

<?php $data = array('myString' => '...'); ?>

<script>
   var phpData = <?php echo json_encode($data) ?>;
   alert(phpData.myString);
</script>

6
所有建议使用str_replace("'","\\'", $string)和类似方法的答案都是错误的。考虑字符串',它将被替换为\',这会导致注入漏洞。相反,请像Crozin建议的那样使用json_encode。 - David M.
1
谢谢。我知道这个问题,但是我一直在尝试使用JSON.parse('<?php echo json_encode($data);?>');,但是失败了,因为数据中有一个单引号。后来我知道在这里不需要使用JSON.parse - Ravi Dhoriya ツ
如果未安装json扩展,json_encode可能会让你陷入麻烦。请阅读下面使用strtr(..)的解决方案。 - Basil Musa
2
@BasilMusa 自 PHP 5.2 起,JSON 扩展默认已经捆绑在一起了(来源),所以我不会担心这个问题。 - Crozin
1
@DavidM. 除了 OP 没有提到 JSON 并且非常明确地说明了他需要什么。 - Julian
太好了!我正在寻找这个,因为我需要从PHP返回一个字符串到JS,这正是正确的方法。谢谢! - Adam

42

如果你想要用 \ 转义字符,可以使用 addcslashes() 函数。例如,如果你只想转义单引号,像这个问题一样,可以做如下操作:

echo addcslashes($value, "'");

如果您想要转义特殊字符 ', ", \ 和字节空值 nul,您可以使用 addslashes() 函数:

echo addslashes($value);

1
感谢指出使用 addcslashes 来转义任意字符。 - Avatar

20
str_replace("'", "\'", $mystringWithSingleQuotes);

18

在某些情况下,我只是将其转换为实体:

                        // i.e.,  $x= ABC\DEFGH'IJKL
$x = str_ireplace("'",  "&apos;", $x);
$x = str_ireplace("\\", "&bsol;", $x);
$x = str_ireplace('"',  "&quot;", $x);
在 HTML 页面上,视觉输出是相同的:
ABC\DEFGH'IJKL

然而,在源代码中已经进行了消毒处理。


10

使用本地函数htmlspecialchars。它会转义所有特殊字符。如果你想要特别转义引号,可以结合使用ENT_COMPATENT_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 &amp; 'Tarzan'<br>
Jane &amp; &#039;Tarzan&#039;<br>
Jane &amp; 'Tarzan'

阅读更多关于PHP htmlspecialchars() 函数的内容


8

要仅替换单引号,请使用此简单语句:

$string = str_replace("'", "\\'", $string);

7
您可以使用addcslashes函数来完成此操作:
echo addcslashes($text, "'\\");

2

经过长时间的问题解决,我认为我找到了更好的解决方案。

将两个函数结合起来使用可以使字符串转义以用作 HTML。

第一个函数是为了在 JavaScript 函数调用中转义双引号;第二个函数是为了转义单引号,避免这些单引号围绕参数。

解决方案:

mysql_real_escape_string(htmlspecialchars($string))

解决方案:

  • 创建一个PHP代码行来调用JavaScript函数,如下所示:

echo 'onclick="javascript_function(\'' . mysql_real_escape_string(htmlspecialchars($string))

请注意,此处的HTML标签保留不变。

1
我写了下面的函数。它替换了以下内容:
单引号 ['] 替换为斜杠和单引号 [\']。
反斜杠 [\] 替换为两个反斜杠 [\\]。
function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\'
    );
    return strtr($target, $replacements);
}

您可以修改$replacements数组中的字符替换,以添加或删除替换。例如,要替换\r\n,它变成了"\r\n" => "\r\n"和"\n" => "\n"。
/**
 * With new line replacements too
 */
function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\',
            "\r\n" => "\\r\\n",
            "\n" => "\\n"
    );
    return strtr($target, $replacements);
}

strtr的一个好处是它会优先选择较长的替换方式。例如,"Cool\r\nFeature"将会转义\r\n而不是只转义\n。

0

我不确定你在处理数据方面具体在做什么,但你可以尝试:

$string = str_replace("'", "%27", $string);

每当将字符串发送到数据库进行存储时,我都会使用它。

%27是'字符的编码,如果一个字符串中包含单个'字符,它还有助于防止GET请求的中断。我会在JavaScript和PHP中用%27替换',以防有人试图手动向您的PHP函数发送一些数据。

为了使最终用户更美观,只需对从服务器返回的所有数据运行反向替换函数,并将所有%27子字符串替换为'

避免注入攻击,祝愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接