提问人:Aaron 提问时间:5/3/2011 最后编辑:paviumAaron 更新时间:5/3/2011 访问量:117
为什么此字符串验证脚本不起作用?
why won't this string validation script work?
问:
这些函数位于类文件中,并通过窗体传递变量。 如果我向它传递一个只有字符 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';
}
}
答:
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 个字符之间的小写字母的单词匹配。
评论
error_reporting(E_ALL)
preg_match: internal pcre_fullinfo() error -3