Я пытаюсь проверить имя пользователя в соответствии со следующим правилом:

Без пробела в начале или в конце, минимум 2 символа, не должно быть следующих символов: \ " ' % ; ( )

Выражение, которое я написал на PHP:

if (preg_match('#[<>"\'%;()&\\\\]|\\.\\./#', $this->username) || StringHelper::strlen($this->username) < 2
        || $filterInput->clean($this->username, 'TRIM') !== $this->username || StringHelper::strlen($this->username) > 150)
    {
        return false; //false will display an error message
    }

Но при попытке использовать следующие имена пользователей:

  1. userName
  2. userName<>test: принято как userNametest
  3. имя_пользователя> тест: не принято

Таким образом, символы < и > должны совпадать, и они должны быть в сообщении об ошибке.

Но я думаю, что другие части проверки ломаются. Пожалуйста, дайте мне знать, что не так в выражении регулярного выражения.

0
Shubham Verma 26 Янв 2022 в 14:24

4 ответа

Попробуйте это выражение

^ +|[ )"'%;()]$

рег

0
WiatroBosy 26 Янв 2022 в 14:44
Отображает сообщение об ошибке для символов <>. Но также отображает сообщение об ошибке для обычной строки ex: «имя пользователя»
 – 
Shubham Verma
26 Янв 2022 в 15:32

Или этот:

$test=array("test>string"," test<string","abc;def","a(bc)d");

foreach($test as $t)
   echo "$t: ".preg_match("/^[^\\\"'%;()]+$/",trim($t))."\n";

Результат:

test>string: 1
test<string: 1
abc;def: 0
a(bc)d: 0

Вместо того, чтобы проверять наличие пробелов в начале и в конце, я бы просто обрезал их!

0
Carsten Massmann 26 Янв 2022 в 14:53

Не лучше ли было бы с

function isValidUsername(string $name, string &$failReason=null): bool {
    if($name!==ltrim($name)){
        $failReason = "username cannot start with spaces";
        return false;
    }
    if($name!==rtrim($name)){
        $failReason = "username cannot end with spaces";
        return false;
    }
    $len = strlen($name);
    if($len < 2){
        $failReason = "username must be minimum 2 characters long";
        return false;
    }
    if($len !== ($illegalPos = strcspn($name , '\\"\'%;()'))){
        $failReason = "illegal character on position {$illegalPos}";
        return false;
    }
    $failReason = "";
    return true;
}

Тогда вы также могли бы точно объяснить, что не так с именем пользователя... кстати, вы действительно намереваетесь разрешить NULL-байты в своем имени пользователя? например, "a\x00b" является допустимым именем пользователя? я бы добавил \x00 к недопустимым символам, а также сделал бы if(!mb_check_encoding($name,'UTF-8')){$failReason="username must be UTF-8";return false;}

0
hanshenrik 26 Янв 2022 в 14:55

Ознакомьтесь с этой статьей, она направит и расскажет вам, как использовать регулярное выражение

https://support.kobotoolbox.org/restrict_responses.html

0
princess 26 Янв 2022 в 15:49