如何仅转义单引号?


71

我正在编写一些JavaScript代码,该代码使用PHP渲染的字符串。如何在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
@弗兰克:您可以将答案发布为答案而不是评论吗?无法选择评论中的正确答案,因此会产生假的“未回答的问题”。
Sylverdrag

为什么不能只用双引号.html()而不是用单引号引起来?php扩展将发生。对于元素和导入中的属性以及脚本块中的变量赋值,一切都在这样做。
马克·卡彭特(Marc Carpenter Jr)'18年

Answers:


67

很简单:echo str_replace('\'', '\\\'', $myString); 但是,我建议使用JSONjson_encode()函数,因为它会更可靠(例如,引用新行):

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

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

5
所有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's

2
@BasilMusa自PHP 5.2起,默认情况下()捆绑了JSON扩展,因此我不必担心。
Crozin

1
@DavidM。除了OP从不提及JSON且对他的需求非常具体外,其他都没有。
朱利安

23

如果要使用a来转义字符\,则可以使用addcslashes()。例如,如果您只想转义单引号(例如问题),则可以执行以下操作:

echo addcslashes($value, "'");

如果你想逃避'"\,和nul(字节空),你可以使用addslashes()

echo addslashes($value);

1
感谢您指出addcslashes以转义任意字符。
Kai Noack


14

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

                        // 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

但是,已在源代码中对其进行了消毒。


8

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

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

7

使用本机功能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 &amp; 'Tarzan'<br>
Jane &amp; &#039;Tarzan&#039;<br>
Jane &amp; 'Tarzan'

PHP htmlspecialchars()函数中阅读更多内容



2

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

这两个功能的组合使得可以对字符串进行转义以用作HTML。

第一,如果在JavaScript函数调用中使用字符串,则转义双引号;第二个则转义使用单引号,避免在参数周围使用那些简单的引号。

解:

mysql_real_escape_string(htmlspecialchars($string))

解决:

  • 创建一个PHP行来调用JavaScript函数,例如

echo'onclick =“ javascript_function(\''。mysql_real_escape_string(htmlspecialchars($ string))”


0

这是我的方法。愚蠢但简单。

$singlequote = "'";
$picturefile = getProductPicture($id);

echo showPicture('.$singlequote.$picturefile.$singlequote.');

我正在输出称为JavaScript代码的HTML以显示图片...


0

我不确定您对数据到底做了什么,但是您可以随时尝试:

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

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

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

要使其对最终用户更漂亮,只需对从服务器获取的所有数据运行反向替换功能,然后将所有%27子字符串替换为'

快乐注射避免!


0

我写了下面的函数。它代替了以下内容:

带斜杠的单引号[']和带单引号[\']的单引号。

带两个反斜杠[\\]的反斜杠[\]

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.