我正在尝试找到检查字符串是否包含任何“怪异”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
谢谢
答案 0 :(得分:1)
在php中,你可以使用正则表达式使用这些转义来查找具有某些属性的字符:
\ p {xx}(含)
\ P {xx}(独家)
xx是您正在寻找的特定属性。
以下是属性列表:http://php.net/manual/en/regexp.reference.unicode.php
我认为对于你的情况,你会想要这样的陈述:
[\ p {XX} \ p {YY} ..等] +
其中“...... etc”是符号并代表其他属性。这应该匹配您正在寻找的所有字符。
以下是测试正则表达式语句的链接:http://www.phpliveregex.com/
答案 1 :(得分:0)
使用这些方法的多字节版本:
mb_strlen :http://us1.php.net/mb_strlen
虽然我相信这种方法可能完全符合您的要求:http://us1.php.net/manual/en/function.mb-check-encoding.php