Я пытаюсь проверить имя пользователя в соответствии со следующим правилом:
Без пробела в начале или в конце, минимум 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
}
Но при попытке использовать следующие имена пользователей:
- userName
- userName<>test: принято как userNametest
- имя_пользователя> тест: не принято
Таким образом, символы < и > должны совпадать, и они должны быть в сообщении об ошибке.
Но я думаю, что другие части проверки ломаются. Пожалуйста, дайте мне знать, что не так в выражении регулярного выражения.
4 ответа
Попробуйте это выражение
^ +|[ )"'%;()]$
Или этот:
$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
Вместо того, чтобы проверять наличие пробелов в начале и в конце, я бы просто обрезал их!
Не лучше ли было бы с
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;}
Ознакомьтесь с этой статьей, она направит и расскажет вам, как использовать регулярное выражение
https://support.kobotoolbox.org/restrict_responses.html
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.