1

フォーム データを収集し、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 の結果であっても、文字列を適切なものとして受け入れ、エラーをスローしません。

4

2 に答える 2

0

これを試して:-

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

于 2013-08-30T00:39:33.183 に答える
0
$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 文字があり、それらと " だけをエスケープする必要があります: ^$[]()|.*+-

于 2013-08-29T08:18:49.800 に答える