为什么此字符串验证脚本不起作用?

why won't this string validation script work?

提问人:Aaron 提问时间:5/3/2011 最后编辑:paviumAaron 更新时间:5/3/2011 访问量:117

问:

这些函数位于类文件中,并通过窗体传递变量。 如果我向它传递一个只有字符 a-z 或 A-Z 的字符串,为什么它会说 No match?

function pattern_check($patten, $string) {
$pass = preg_match($patten, $string);
return $pass;
}
function check_name($name) {
    $pat = '/^[a-zA-Z]/';
    $name = $this->pattern_check($pat, $name);
    if($name) {
        echo "Match";
    }
    else {
        echo 'No match';
    }

}
PHP 正则表达 哎呀

评论

0赞 Aron Rotteveel 5/3/2011
您要检查的字符串是什么?
0赞 Aaron 5/3/2011
只是一个带有纯 ASCII 字符的文本输入字符串。.
2赞 Wesley Murch 5/3/2011
Matthew,你运行的是哪个版本的 PHP?所以,打开,你收到错误了吗?error_reporting(E_ALL)preg_match: internal pcre_fullinfo() error -3
1赞 Aaron 5/3/2011
我正在运行php 5.3.5,我打开了E_ALL,但没有收到任何错误消息。
1赞 Wesley Murch 5/3/2011
FWIW 这在 5.2 上对我来说工作正常,但代码板抛出错误

答:

3赞 Fidi 5/3/2011 #1

您当前唯一要验证的是,字符串中的第一个字符是一个字母。仅此而已。

如果你想检查完整的字符串是否只是字母,你将不得不使用像 .这样可以确保允许有多个字母。此外,您还必须注意测试字符串的编码。如果字符串是 utf8,则必须将修饰符与正则表达式一起使用,例如'#^[a-zA-Z]+$#'u#^[a-zA-Z]+#u

评论

0赞 ridgerunner 5/3/2011
实际上,只有当模式包含 unicode 而不是目标字符串时,才需要修饰符。'u'
2赞 johnsyweb 5/3/2011 #2

这似乎完全按照您的指定工作。它检查字符串是否以字母字符开头。你的字符串一定不是你想象的那样。

我将其包装在一个测试函数中,并给它提供了一些字符串:

function test($name)
{
    echo "${name}: ";
    check_name($name);
    echo "\n";
}

test(" ZZ1");
test("123");
test("4aa");
test("AAA");
test("Z11");
test("ZZ ");
test("ZZZ");
test("aaa");
test("zzz");
test("Ábc");

输出。。。

% ./test.php    

 ZZ1: No match
123: No match
4aa: No match
AAA: Match
Z11: Match
ZZ : Match
ZZZ: Match
aaa: Match
zzz: Match
Ábc: No match

% php --version
PHP 5.3.4 (cli) (built: Dec 15 2010 12:15:07) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

变量的重用可能会令人困惑:$name

$name = $this->pattern_check($pat, $name);
if($name) {

请考虑改用以下方法:

$matched = $this->pattern_check($pat, $name);
if ($matched) {
1赞 TigerTiger 5/3/2011 #3

如果这些函数不是 php 类的一部分 ..那么错误就在你的行中

$name = $this->pattern_check($pat, $name);

将其更改为

$name = pattern_check($pat, $name);

让我知道它是否有效?

更新 -- 对不起..因为我刚刚快速测试了它,它似乎有效

class mytest{


    private function pattern_check($patten, $string) {
        $pass = preg_match($patten, $string);
        return $pass;
    }
    public function check_name($name) {
        $pat = '/^[a-zA-Z]/';
        $name = $this->pattern_check($pat, $name);
        if($name) {
            echo "Match";
        }
        else {
            echo 'No match';
        }

    }

}
$obj = new mytest();
$obj->check_name('ABCDEFG');
OUTPUT -> Match

评论

0赞 Wesley Murch 5/3/2011
读了我看到的问题,然后他仍然不会得到结果,只有错误。These functions are in a class file
0赞 Aaron 5/3/2011 #4

我已经意识到正则表达式是不正确的,检查正确名称的正确模式是确保它在大写字母后用小写字母大写,因此,

[A-Z]*[a-z]{1,50} 将与任何以大写字母开头并紧跟在大写字母后面的 1 到 50 个字符之间的小写字母的单词匹配。