Цвет обычно характеризуется тремя параметрами. В зависимости от цветовой модели: RGB (красный, зелёный, синий); HSV (оттенок, насыщенность, яркость); Lab (яркость, красно-зеленая ось, сине-жёлтая ось) и др. Больше-меньше можно сравнить только по какой-то одной оси.
«темнее, чем #f2f2f1» – можно определять, переведя цвет из RGB в HSV или Lab (гуглите формулы) и сравнивая только компонент яркости.
Ну, или безобразно упростить до трёх сравнений: каждого из R, G, B компонентов:
R < 0xF2 || B < 0xF2 || B < 0xF1
Здесь косяк в том, что один компонент (напр. R) чуть-меньше порога, и остальные много выше него – дадут цвет более светлый, а этот подход посчитает его темнее.
str_split('f1f2f3', 2) даст массив
['f1', 'f2', 'f3']
.
intval('f1', 16) сделает из строки 'f1' число 241.