【问题标题】:Passing Special Characters to PHP via AJAX通过 AJAX 将特殊字符传递给 PHP
【发布时间】:2013-09-01 06:21:39
【问题描述】:

我正在收集表单数据,通过 AJAX 调用将其发送到 PHP 验证脚本。问题出在特殊字符上,php 验证脚本没有按预期工作。

HTML:

<input type="text" name="firstName" class="firstName"
       placeholder="[first name]" required autofocus maxlength="25" size="25" />

JS:

$(".button").click(function () {
    var firstName = encodeURIComponent($("input.firstName").val());
    var datastring = "firstName=" + firstName;

    $.ajax({
        type: "POST",
        url: "/scripts/validateSignup.php",
        data: datastring,
        cache: false,
        success: function (errorMessage) {
            //print to screen
        }
    });
});

PHP 验证

$postData = $_POST;

if (Filter::validateString($postData['firstName']) == false) {
    echo "Oops! Some characters used in your first name are not valid.";
}

PHP 过滤器

//Returns true if string is good, false otherwise
public static function validateString($string) {
    $string = trim($string);

    if ($string == null || $string == "") {
        return false;
    } else {
        if (preg_match("/[^\.\,\-\_\'\"\@\?\!\:\;\$\#\%\&\+\= a-zA-Z0-9()]/", $string) == true) {
            return false;
        } else {
            return true;
        }
    }
}

在一个空字符串上它会在屏幕上打印错误就好了。但是,如果我执行“~!@#$%^&*()”之类的操作,那么即使 preg_match == false 的结果,它也会将字符串视为良好并且不会抛出错误。

【问题讨论】:

  • the docs : preg_match() 如果模式匹配给定的主题,则返回 1,如果不匹配,则返回 0,如果发生错误,则返回 FALSE。 您是否尝试过比较 @987654326改为@?
  • @davidkonrad:很高兴知道,但仍然不是预期的结果。我确定 validateString 返回 false,但 if 条件不接受它...
  • 来自 pregmatch 的文档 此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。尝试使用 === 而不是 ==
  • @Atul:也不工作。我进入 validateString 并摆脱了 preg_match 并返回 false。然而对于 php 验证脚本,它不会触发 if 条件。
  • 但是如果 return false 对空白和空字符串工作正常,那么它也应该工作正常。我尝试使用其他 preg_match 将其作为答案

标签: php ajax regex validation


【解决方案1】:
$string = trim($string);

if ($string == null || $string == "") {
    return false;
} else {
    if (preg_match("/[^\.,\-_'\"@?!:;\$#&\+=\sa-zA-Z0-9\(\)]/", $string) == true) {
        return false;
    } else {
        return true;
    }
}

这是更有效的正则表达式,但不是您想要的结果:您正在检查几乎所有输入,因此它将匹配“abcd”并返回 false。正则表达式有 11 个具有特殊含义的字符,只有那些和 " 需要转义:^$[]()|.*+-

【讨论】:

    【解决方案2】:

    试试这个:-

    <?php
    $string = "tes$%tname"; // invalid string
    //$string = "testname"; // valid string
    
    if(test($string) == false)
    {
        echo "String is invalid";
    }
    
    
    function test($string){
        $string = trim($string);
    
        if ($string == null || $string == "") {
            return false;
        } else {
            if (preg_match("/[^\.,\-_'\"@?!:;\$#&\+=\sa-zA-Z0-9\(\)]/",$string) == true) {
                return false;
            } else {
                return true;
            }
        }
    }
    
    ?>
    

    PHPFiddle 在这里:- http://phpfiddle.org/main/code/cdu-xg2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2015-11-22
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多