Я пытаюсь найти лучший способ проверить, есть ли в строке какие-либо «странные» символы UTF-8.
В основном я ищу что-то, что защитило бы от всех различных управляющих символов UTF 8, отличных от пробелов, которые могут быть скрыты в строке. Когда я говорю «скрытый», я имею в виду, что вывод строки на экран не будет отображать эти символы. Они будут либо пробелами, либо пустыми символами.
Мой предыдущий подход к решению этой проблемы заключался в том, чтобы вернуть true, если строка является одним из этих символов:
function isUnusualString($string) {
if($string == "")
return TRUE;
$char = ord($string);
if($char < 33)
return TRUE;
if($char > 8191 && $char < 8208)
return TRUE;
if($char > 8231 && $char < 8240)
return TRUE;
switch($char) {
case 160: // Non-Breaking Space
case 8287: // Medium Mathematical Space
return TRUE;
break;
}
return FALSE;
}
Однако это не охватывает все случаи, и я не знаю, почему. Я предполагаю, что некоторые из этих символов могут быть больше длины 1 или длины 0?.
Итак, затем я попытался перебрать символы строки и проверить, содержит ли строка какой-либо из «скрытых» символов.
Например, запуск следующего кода:
function isUnusualUTF($string) {
if($string == "")
return TRUE;
$strlen = strlen($string);
for ($i = 0; $i < $strlen; ++$i) {
$char = ord($string[$i]);
if($char < 33)
echo "char = ".$char." at index: ".$i." is < 33";
if($char > 8191 && $char < 8208)
echo "char = ".$char." at index: ".$i." is >8191 and < 8240 ";
if($char > 8231 && $char < 8240)
echo "char = ".$char." at index: ".$i." is > 8231 and < 8240 ";
switch($char) {
case 160: // Non-Breaking Space
case 8287: // Medium Mathematical Space
echo "cases<br>"; //return TRUE;
break;
}
}
return FALSE;
}
$string = "Unicode ";
echo isUnusualUTF($string);
Выходы:
char = 32 at index: 7 is < 33
Я думаю, что лучший способ сделать это - использовать регулярное выражение, которое делает:
if string has (numbers or letters or " " or other symbols
that can be printed and seen in the screen)
return true
else
return false
Спасибо