Я хочу соответствовать подмножеству символов unicode / UTF-8 (отмеченный желтым здесь http://solomon.ie/unicode/ ), из моего исследования я придумал следующее:
// ensure it's valid unicode / get rid of invalid UTF8 chars $text = iconv("UTF-8","UTF-8//IGNORE",$text); // and just allow a basic english...ish.. chars through - no controls, chinese etc $match_list = "\x{09}\x{0a}\x{0d}\x{20}-\x{7e}"; // basic ascii chars plus CR,LF and TAB $match_list .= "\x{a1}-\x{ff}"; // extended latin 1 chars excluding control chars $match_list .= "\x{20ac}"; // euro symbol if (preg_match("/[^$match_list]/u", $text) ) $error_text_array[] = "<b>INVALID UNICODE characters</b>";
Тестирование, похоже, показывает, что он работает так, как ожидалось, но, будучи новичком в uniocde, я был бы признателен, если бы кто-нибудь здесь обнаружил любые уязвимости, которые я упустил.
Могу ли я подтвердить, что шестнадцатеричные диапазоны соответствуют кодовым точкам юникода, а не фактическому шестнадцатеричному значению (т. Е. X20ac вместо xe282ac для символа евро является правильным)?
И можно ли смешивать буквенные символы и шестнадцатеричные значения, такие как preg_match ("/ [^ 0-9 \ x {20ac}] / u", $ text)?
Спасибо, Кевин
Заметьте, я пробовал этот вопрос раньше, но он был закрыт – «лучше подходит для codereview.stackexchange.com», но ответа там нет, так что надеемся, что будет нормально повторить попытку в гораздо более сжатом формате.