0

我想防止新用户在他们的用户 ID 和密码中包含撇号、引号和其他特殊字符,因为我发现这些可能会在未来产生意想不到的问题。与其预测这些问题中的每一个,我宁愿一开始就禁止用户在注册时包含这些字符。

网上有很多关于如何逃脱它们以将它们放入数据库的问题和东西,但这不是问题。我只想抛出一个错误消息,说输入不同的内容。

我努力了:

$username = $_POST['username'];
if (preg_match ("/[&<>%\*\,\.\'\"]/i", $uid)) {
$strError="Your userid may not contain a special character.  Please try again.";
}

但这会引发错误没有找到结束分隔符'''

将不胜感激任何建议。

谢谢。

4

5 回答 5

1

我认为你正在以错误的方式解决这个问题。不要将特殊字符列入黑名单,而是尝试将字母和数字列入白名单,例如

$username = $_POST['username'];
if (!preg_match('/^[\w\d]$/', $uid)) {
    $strError="Your userid may not contain a special character.  Please try again.";
}

包括星号和分号:

$username = $_POST['username'];
if (!preg_match('/^[\w\d\*;]$/', $uid)) {
    $strError="Your userid may not contain a special character.  Please try again.";
}
于 2013-06-29T12:46:14.713 回答
1

简化它...

<?php
  $username = $_POST["username"];
  if ( preg_match( "/^[A-Za-z0-9_]{3,20}$/", $username ) ) {
    // username is valid
  }
  else {
    // it contains special chars
  }
?>

解释regex...

"/^[
A-Z # any uppercase letters
a-z # any lowercase letters
0-9 # any digits
_ # underscore
]{3,20} # minimum 3 and maximum 20 characters
$/x"
于 2013-06-29T13:02:19.000 回答
0

我可以建议您不要使用 preg_match 吗?

php 具有更好的“清理”字符串的功能 - 例如filter_var - 查看FILTER_SANITIZE_STRING 我会建议这个片段

$usernameRaw = trim($_POST['username']);
$username = filter_var( $usernameRaw , FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
于 2013-06-29T13:16:01.817 回答
0

语法高亮显示你明显的错误:你'在这一行有一个额外的:

$username = $_POSt['username']';

应该

$username = $_POST['username'];
于 2013-06-29T12:37:42.337 回答
0
if (preg_match('/[^a-zA-Z]+/', $your_string, $matches))
{
  echo 'Your userid may not contain a special character.  Please try again.';
}
else
{
  // No special characters found
}
于 2013-06-29T12:42:27.777 回答