1

我写了一段代码,它接受用户的输入并将其插入数据库。HTML 代码如下:

<td align="center"><textarea class="txt" required=required rows="3" name="Xschool" cols="30"></textarea></td>

我需要检查数据是否有任何特殊符号。我为此使用了正则表达式,如下所示:

    $Xschool=$_POST['Xschool'];
    $pattern = '/[A-Z ]+$/';
$Xschool=strtoupper($Xschool);

if(!preg_match($pattern,$Xschool))
{
    echo "<pre>We are sorry. The X School ".$Xschool." is  invalid. Make sure your name contains no special symbols/numbers.</pre>";
    exit;
}

此代码适用于多种类型的输入,但不适用于输入ST MARY'S。当遇到 ' 符号时,代码无法正常工作。我应该怎么做才能克服这个?请帮我!!提前致谢。

4

7 回答 7

1

更改模式以满足您的需求。为此,您首先需要非常清楚地了解您的需求是什么。'/[A-Z ]+$/'没有满足您的需求;会'/[A-Z\' ]+$/'满足你的需求吗?口音呢?拉丁字母以外的字符呢?自己回答这些问题,然后根据您的回答设计正则表达式或其他验证算法。

于 2013-08-02T06:46:39.717 回答
1

你的基本理解有问题。

/[AZ]+$/

将匹配任何包含以 AZ 或空格结尾的行的字符串。

我建议你想要:

if(preg_match('/[^A-Z ]/', $Xschool))
{
 ...
}

它将匹配包含不是 AZ 或空格的字符的任何字符串。

于 2013-08-02T06:56:57.410 回答
0

只需在匹配中包含 ' :

    $Xschool=$_POST['Xschool'];
    $pattern = "/[A-Z ']+$/";
$Xschool=strtoupper($Xschool);

if(!preg_match($pattern,$Xschool))
{
    echo "<pre>We are sorry. The X School ".$Xschool." is  invalid. Make sure your name contains no special symbols/numbers.</pre>";
    exit;
}
于 2013-08-02T06:46:29.353 回答
0

试试这个正则表达式。

[a-zA-Z0-9\'\s]{0,50}

这将允许小写和大写字符以及 0 到 9 位最多 50 个名称的长度。

如果你只想使用大写单词。

[A-Z\'\s]{0,50}
于 2013-08-02T06:50:09.380 回答
0

尝试这个

 $Xschool=$_POST['Xschool'];
$pattern = '/^[a-zA-Z][a-zA-Z ]*$/';
$Xschool=strtoupper($Xschool);

if(!preg_match($pattern,$Xschool))
{
    echo "<pre>We are sorry. The X School ".$Xschool." is  invalid. Make sure your name contains no special symbols/numbers.</pre>";
    exit;
}
于 2013-08-02T06:55:00.370 回答
0

您的模式 ,/[A-Z ]+$/不包括起始锚点。这意味着当您尝试将其与 匹配时ST MARY'S,它会匹配结尾S并且您的代码不会看到任何错误。将模式更改为/^[A-Z ]+$/将解决该问题。

但是,根据您的评论,您有一个更大的问题 - 您盲目地将用户输入传递给 SQL 查询而不对其进行清理,这意味着您容易受到 SQL 注入攻击学习防御这些攻击的正确方法,而不是想出像这个正则表达式这样被误导的创可贴。

于 2013-08-02T07:01:58.023 回答
0

另一种方法:

替换所有有效字符,在您的场景中 A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U ,V,W,X,Y,Z,SPACE 和任何其他没有“”的有效字符。然后,如果剩余字符串的长度 > 0,则意味着必须存在其他一些 INVALID 字符。

<?php

    function isStringOnlyAZSPACE($the_string)
    {
        $valid_chars = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',' ');

        $the_string  = str_replace($valid_chars, "", $the_string);

        return (strlen($the_string)==0);
    }

    echo isStringOnlyAZSPACE("ST MARY'S")?"true":"false"; // FALSE

    echo isStringOnlyAZSPACE("ST MARYS")?"true":"false"; // TRUE

?>

在此处查看实际操作http://3v4l.org/GvVi6

我还必须重复@DCoder 在您的问题中的评论“这绝对是避免 SQL 错误的错误方法。”

于 2013-08-02T07:13:18.533 回答