如何使用str_replace替换单引号和双引号

8
我必须创建一个登录表单,用户需要输入用户名和密码。我必须确保不处理html实体,并且也不能处理单引号或双引号。我必须回显表单中输入的数据并显示它。
我必须使用 htmlentities 和 str_replace 函数。我已经正确地使用了 htmlentities 函数,但是不确定如何使用 str_replace 函数来替换用户可能输入到表单中的单引号和双引号。任何帮助都将非常棒。
以下是我的当前PHP代码(有效):
<?php
$username = htmlspecialchars($_POST['username']);
$password    = htmlspecialchars($_POST['password']);
$comment = htmlspecialchars($_POST['comment']);
?>
<html>
<body>
Your username is: <?php echo $username; ?><br />
Your password: <?php echo $password; ?><br />
Your Comment was: <?php echo $comment; ?>


2
引号有什么问题吗?根据您的代码,它不会造成任何损害。(您没有使用数据库。PHP可以自动处理斜杠) - AKS
这就是教练想要的。他想确保我们知道如何使用str_function。到目前为止,这只让我头痛(因为我非常新手PHP)。 - Jeremy Flaugher
7个回答

22

首先,总是最好检查不需要的字符并将其返回给用户,而不是默默地将它们删除。比如说,如果用户在他们的密码中添加了引号,你将其删除,这样他们就无法登录了!因此最好检查并告诉用户:

if (!ctype_alnum($username)) { 
    $errors[] = "Only letters and numbers allowed in username";
}
...
if ($errors) {
    echo "You've got some errors, please fix them: ". implode("<br>", $errors);
} else {
    // proceed with normal flow

但在这种情况下,我建议不要替换任何字符。想象一下,Shaquille "Shaq" O'Neal将要在您的网站上注册。剥夺他所有这些引号的意义是什么?更不用说密码了,密码中使用标点符号是非常鼓励的。

毕竟,如果正确处理它们,这些引号并不会造成任何伤害。

  • 对于HTML,只需使用带有ENT_QUOTES属性的htmlspecialchars()

      Your username is: <?= htmlspecialchars($username, ENT_QUOTES) ?><br />
    
  • 对于SQL,请使用预处理语句以避免引号引起的任何问题。

但仅出于字面上的回答,以下是如何在PHP中删除引号(或任何其他字符,甚至是多个字符子串)的方法

$yourVariable = "scor\"pi'on";
$substringsToRemove = ['\'', '"'];
$yourVariable = str_replace($substringsToRemove, "", $yourVariable);

4
 $keyItem = str_replace ("'","\'",$keyItem);

这将把单引号替换为转义的单引号 \'。


3
$username = htmlentities(str_replace(array('"', "'"), '', $_POST['username']));

1
$username = str_replace(array("'", "\""), "", htmlspecialchars($_POST['username']));

0
尝试以下代码替换双引号:
str_replace(chr(34), "replace_with", $content);

对于单引号

str_replace("'", "replace_with", $content);

0

要删除引号,可以使用以下代码:

$search = 'cars "black" in ...';
$search = str_replace("\"", "", $search);
// result: "cars black in ..."

-1
$username_test = $_POST['username'];
$username = str_replace(array("'", "\"", "&quot;"), "",htmlspecialchars($username_test) );


//same for password :) 

1
你能否添加一些详细说明为什么这个代码会起作用?仅有代码的回答并不是很有用,也可能被删除。 - Cristik
在这个例子中,我们将搜索用户名。假设用户名是cris'tik。现在它会找到用户名中的引号('),并将其替换为空格。答案与问题相关,所以我认为不需要解释。 - rahul
1
即使提问者只想要代码(虽然在这里似乎不是这种情况),对于他来说,您的答案已经足够了,但 SO 的一个优点是回答者也会尝试教育人们,而不是给他们复制和粘贴的答案。这就是为什么解释解决方案的答案比其他没有解释的答案更受欢迎并获得更多的投票。 - Cristik

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