无法将数据与PHP中的常规表达式匹配

时间:2013-08-02 06:40:47

标签: php regex

我写了一段代码,接受用户的输入并将其插入数据库。 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。当遇到'符号时,代码不能正常工作。我该怎么做才能克服这个问题?请帮我!!提前谢谢。

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你的基本理解有问题。

/ [A-Z] + $ /

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

我建议您要:

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

将匹配任何包含非A-Z或空格的字符串的字符串。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

试试这个正则表达式。

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

这将允许小&amp;大写字母和0到9位数,最多50个名字。

如果您只想使用大写字母。

[A-Z\'\s]{0,50}

答案 4 :(得分: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;
}

答案 5 :(得分:0)

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

但是,根据您的评论,您有一个更大的问题 - 您盲目地将用户输入传递给SQL查询而不对其进行清理,这意味着您容易受到 SQL injection attacks的攻击。 Learn the right way to defend against these attacks而不是像这个正则表达式那样提出被误导的绑匪。

答案 6 :(得分: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和任何其他没有“”的VALID字符。然后,如果剩余的字符串的长度> 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错误的错误方法。”