PHP: строка соответствия регулярному выражению без предшествующего числа или пробела - PullRequest
2 голосов
/ 20 июля 2011

Я пытался проверить, начинается ли строковое значение с числового значения или пробела, и действовать соответствующим образом, но, похоже, оно не работает.Вот мой код:

private static function ParseGamertag( $gamertag )
{

    $safetag = preg_replace( "/[^a-zA-Z0-9\s]+/", "", $gamertag ); // Remove all illegal characters : works
    $safetag = preg_replace( "/[\s]+/", "\s", $safetag ); // Replace all 1 or more space characters with only 1 space : works
    $safetag = preg_replace( "/\s/", "%20", $safetag ); // Encode the space characters : works

    if ( preg_match( "/[^\d\s][a-zA-Z0-9\s]*/", $safetag ) ) // Match a string that does not start with numerical value : not working
        return ( $safetag );
    else
        return ( null );

}

То есть hiphop112 допустимо, но 112hiphip недействительно.0down недопустимо.

Первый символ ДОЛЖЕН быть буквенным символом [a-zA-Z].

Любая помощь приветствуется.

Ответы [ 6 ]

4 голосов
/ 20 июля 2011

Вам нужно привязать ваш шаблон к началу строки, используя привязку ^

preg_match( "/^[^\d\s][a-zA-Z0-9\s]*/", $safetag )

В противном случае ваше регулярное выражение найдет правильное совпадение где-то в строке

Вы можете найти объяснение якорей здесь, на регулярной основе-infopressinfo.info

Обратите внимание на другое значение ^. Вне класса символов он является якорем для начала строки, а внутри класса символов в первой позиции это отрицание класса.

3 голосов
/ 20 июля 2011

Попробуйте добавить ^ для обозначения начала строки ...

preg_match( "/^[^\d\s][a-zA-Z0-9\s]*/", $safetag )

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

preg_match( "/^[a-zA-Z][a-zA-Z0-9\s]*/", $safetag )
2 голосов
/ 20 июля 2011

Используйте ^, чтобы отметить начало строки (хотя ^ внутри [ ] означает , а не ).

Вы также можете использовать \w вместо a-zA-Z0-9

/^[^\d\s][\w\s]*/
1 голос
/ 20 июля 2011

Во-первых, ничто не будет соответствовать \ s, поскольку вы заменили все пробелы на% 20.

Почему бы просто не соответствовать положительно:

[a-zA-Z][a-zA-Z0-9\s]*
1 голос
/ 20 июля 2011

Добавьте «начинается с моркови» в начале регулярного выражения:

/^[^\d\s][a-zA-Z0-9\s]*/
0 голосов
/ 20 июля 2011
preg_match( "/^[a-zA-Z]+[a-zA-Z0-9\s]*/", $safetag ) )
...