Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Проверить html цвет на валидность

#php #html


Есть поле INPUT, в который вводится цвет вида fff (обязательно без "#" она подставляется
в самом html).

Из него данные передаются в PHP и там в HTML прямо подставляется то значение, как
его правильнее фильтровать?
И сделать чтобы если оно невалидное, то подставлялось стандартное значение?
    


Ответы

Ответ 1



Проверить валидность можно регуляркой. Например такой, так как цвет можно задавать как 3-мя, так 6-ми символами: /^([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$/i Как-то так: $color; // тут у вас строка с цветом if(preg_match('/^([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$/i', $color)){ // валидный цвет } else{ // не валидный цвет }

Ответ 2



Экономим на спичках! preg_match() считается медленной функцией. Быстрее проверить длину строки (только 3 или 6), а затем ASCII код каждого символа в строке: = 97 && $code <= 102) continue; // a-f if( $code >= 65 && $code <= 70) continue; // A-F if( $code >= 48 && $code <= 57) continue; // 0-9 return false; } return true; } Ideone с тестами.

Ответ 3



Можно проще: function validate_color($str){ return (($l=strlen($str))==3)||($l==6)) && sscanf($str,"%x", $color); } print(validate_color("AAA")? "цвет валидный": "цвет не валидный"); P.S. Снимаем вопросы по быстродействию: function validate_color_sscan($str){ return ($l=strlen($str)) && (($l==3)||($l==6)) && sscanf($str,"%x", $color); } function test_sscan($str){ for($i=0; $i<2000000; $i++) $v=($l=strlen($str)) && (($l==3)||($l==6)) && sscanf($str,"%x", $color); } function validate_color_preg($str){ return preg_match('/^[A-F0-9]{3}([A-F0-9]{3})?$/i', $str); } function test_preg($str){ for($i=0; $i<2000000; $i++) $v=preg_match('/[a-f0-9]{3}([a-f0-9]{3})?$/i', $str); } print(validate_color_sscan("AAA")? "
цвет валидный": "
цвет не валидный"); print(validate_color_preg("AAA")? "
цвет валидный": "
цвет не валидный"); $time0 = microtime(true); test_sscan($str); $time1 = microtime(true); test_preg($str); $time2 = microtime(true); printf("
test_sscan x 2000000: %d mcs", $time1-$time0); printf("
test_preg x 2000000: %d mcs", $time2-$time1); Результаты: цвет валидный цвет валидный test_sscan x 2000000: 8 mcs test_preg x 2000000: 14 mcs

Ответ 4



preg_match('/^([a-f0-9]{6}|[a-f0-9]{3})$/i', $color)

Ответ 5



Хотелось найти еще какой-либо альтернативный вариант, помимо регулярных выражений. Откопал функцию ctype_xdigit() - проверяет, является ли строка шестнадцатеричным значением (без символа решетки). Не ручаюсь на счет производительности, не пользовался ей. ctype_xdigit('fff'); // true

Комментариев нет:

Отправить комментарий