почему не работает этот скрипт проверки строки? - PullRequest
3 голосов
/ 03 мая 2011

Эти функции находятся в файле класса, и им передаются переменные через форму.Почему будет указано «Нет совпадения», если я передам строку, содержащую только символы az или AZ?

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';
    }

}

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

Единственное, что вы сейчас пытаетесь проверить, это то, что первый символ в вашей строке - это буква. Ни больше, ни меньше.

Если вы хотите проверить всю строку на наличие букв, вам нужно использовать регулярное выражение типа '#^[a-zA-Z]+$#'. Это гарантирует, что допустимо более одной буквы. Также вам нужно следить за кодировкой тестовой строки. Если строка utf8, вы должны будете использовать модификатор u с вашим регулярным выражением, например #^[a-zA-Z]+#u

2 голосов
/ 03 мая 2011

Кажется, это работает точно так, как вы указали. Он проверяет, что строка начинается с буквенного символа. Ваша строка не должна быть такой, как вы думаете.

Я обернул это в тестовую функцию и выдал несколько строк:

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 голос
/ 03 мая 2011

Если эти функции не являются частью класса 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 голосов
/ 03 мая 2011

Я понял, что регулярное выражение неверно, правильный шаблон для проверки правильности имени будет состоять в том, чтобы убедиться, что оно написано прописными буквами после заглавной буквы, поэтому,

[A-Z] * [a-z] {1,50} будет совпадать со значением true для любого слова, начинающегося с заглавной буквы и сразу после заглавной буквы с прописными буквами от 1 до 50 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...