Php preg_匹配不起作用

Php preg_匹配不起作用,php,preg-match,Php,Preg Match,该脚本检查是否有特殊字符,如果有,则调用preg match的“Invalid”函数,否则显示username available。这里发生的事情是,每次我写一个特殊的字符,比如#@%^&它仍然说用户名可用,而不是说无效,这不是它应该如何工作的。我已经检查了PHP代码的错误,它看起来是干净的。我尝试了论坛上的所有内容,但找不到解决方案。非常感谢您的贡献 if(isset($_POST['login'])) { $login = mysql_real_escape_string($_POS

该脚本检查是否有特殊字符,如果有,则调用preg match的“Invalid”函数,否则显示username available。这里发生的事情是,每次我写一个特殊的字符,比如#@%^&它仍然说用户名可用,而不是说无效,这不是它应该如何工作的。我已经检查了PHP代码的错误,它看起来是干净的。我尝试了论坛上的所有内容,但找不到解决方案。非常感谢您的贡献

if(isset($_POST['login'])) {
    $login = mysql_real_escape_string($_POST['login']);

    if(!empty($login)) {

        $login_query = mysql_query("SELECT COUNT(`id`) FROM `account` WHERE `login` = '$login'");
        $login_result = mysql_result($login_query,0);

        if($login_result == 0) {
           echo 'yes';
        } else {
           echo 'no';
        } 
    } 
 }

 if ( preg_match("/^[a-zA-Z0-9[:space:]]+$/" , $login) )  {
    echo 'noinput'; 
 }

另外,我不是一个从互联网上盗取代码并试图让其他人为他工作的孩子,我已经写了70%的剧本,除了我一直坚持的特殊角色之外,它的效果非常好。我希望你能帮助我。谢谢大家!

不确定你的问题是什么。我刚刚编写了以下程序:

<?php

$input="good string";
$input2="bad@string";

if (preg_match("/^[a-zA-Z0-9[:space:]]+$/",$input2)) {
  echo $input2." matches\n";
}
else {
  echo $input2." does not match\n";
}
if (preg_match("/^[a-zA-Z0-9[:space:]]+$/",$input)) {
  echo $input." matches\n";
}
else {
  echo $input." does not match\n";
}
换句话说,检查字符串
“是”、“否”、“无输入”
。但是,您的代码的结构和运行方式并不是您生成的输出。关于这一点,我建议您参考上述四个案例

解决方案

您需要将对无效输入的检查移到代码的前面;您需要在找到不匹配的用户名后立即返回。我认为以下措施会奏效:

if(isset($_POST['login'])) {
    $login = mysql_real_escape_string($_POST['login']);

    if ( preg_match("/^[a-zA-Z0-9[:space:]]+$/" , $login) )  
    {

        $login_query = mysql_query("SELECT COUNT(`id`) FROM `account` WHERE `login` = '$login'");
        $login_result = mysql_result($login_query,0);

        if($login_result == 0) 
        {
           echo 'yes';
        } 
        else 
        {
           echo 'no';
        } 
    }
    else
    {
       echo('noinput');
    }
 }

您的正则表达式似乎不包含特殊字符。您需要在数字和alpha之外添加要捕获的字符

请看下面的建议:

尝试类似于
/^[a-zA-Z0-9\$[:space:]+$/


\$
说明了文字字符。

/[^a-zA-Z0-9[:space:]]+$/试试这个,告诉我它是否有效。你能添加一些示例输入和预期输出吗?也许你也应该在
preg\u匹配之前做一个
var\u dump($login)
,当你转义字符串时,所有特殊字符都变成“好”字符…@user2986690:你可以通过添加
var\u dump($login)来验证Floris的评论preg_match()
语句之前执行code>。你太快就逃离了输入。您只能在将其插入数据库之前执行此操作。能否显示实际确定用户名是否可用的代码?您的
preg_match
代码在您签入数据库并打印“是”或“否”后运行。还发生了什么?你在原来的帖子中说你不希望特殊字符被允许,但在另一篇评论中你说这些字符是被允许的。是哪一个?哇,太谢谢你了!!它很有魅力,很高兴它奏效了。很抱歉,你不能使用我的skype-这不是本网站的工作方式。但是如果你对这个答案发表进一步的评论,我会得到通知。如果我有时间,我可能会回应。不管怎样,要隐藏这个吗?Floris请编辑这个我很高兴(:@user2986690-这段代码没有什么独特之处。如果你能匿名化变量等,那将比彻底销毁这段内容更好。一旦你得到答案,删除你的问题对回答者和未来的访问者都不公平。@user2986690我很遗憾看到你想删除这些内容这是我的答案。要知道,一旦你在网上发布了一些东西,“它就是永远的”。即使我们删除了这篇文章,编辑历史仍然存在。不确定你相信你的“竞争对手”是谁,但正如布拉德指出的,你的代码并没有那么特别。作为一种姿态,我拿出了“代码快照”从你的链接中删除,因为它实际上与我的答案无关。但试图通过建议大量编辑来删除答案并不是正确的方法。
if(isset($_POST['login'])) {
    $login = mysql_real_escape_string($_POST['login']);

    if ( preg_match("/^[a-zA-Z0-9[:space:]]+$/" , $login) )  
    {

        $login_query = mysql_query("SELECT COUNT(`id`) FROM `account` WHERE `login` = '$login'");
        $login_result = mysql_result($login_query,0);

        if($login_result == 0) 
        {
           echo 'yes';
        } 
        else 
        {
           echo 'no';
        } 
    }
    else
    {
       echo('noinput');
    }
 }