“的字符串比较”;“空白”;PHP中的Unicode字符
我试图检测Unicode字符串是否可打印 例如,我有一个用户已将其名称设置为“的字符串比较”;“空白”;PHP中的Unicode字符,php,unicode,Php,Unicode,我试图检测Unicode字符串是否可打印 例如,我有一个用户已将其名称设置为%EF%B8%8F-这是 我想做一些像这样的事情 if ($screen_name == null || $screen_name == NotPrintable ) { ...Show an error... } else { ...Proceed as normal... } 有没有办法检测Unicode字符串是否可打印 用户名可以是任何有效的Unicode序列(英语、汉语、阿拉伯语等) 有些人建
%EF%B8%8F
-这是
我想做一些像这样的事情
if ($screen_name == null || $screen_name == NotPrintable )
{
...Show an error...
} else {
...Proceed as normal...
}
有没有办法检测Unicode字符串是否可打印
用户名可以是任何有效的Unicode序列(英语、汉语、阿拉伯语等)
有些人建议使用复杂的正则表达式,这些正则表达式看起来只能处理有限的字符
我试着数一数绳子的长度,但那不起作用-
$odd=urldecode(“%EF%B8%8F”);
印花花边($奇数);
3.
同样的结果也适用于mb_strlen()
像这样的函数不起作用,因为常规字符串可能包含不可打印的字符
那么,有没有办法检测Unicode字符串是否会显示可打印字符?这个正则表达式呢
<?php
define("CTYPE_PRINT_UNICODE_PATTERN", "~^[\pL\pN\s\"\~". preg_quote("!#$%&'()*+,-./:;<=>?@[\]^_`{|}´") ."]+$~u");
function ctype_print_unicode($input) {
return preg_match(CTYPE_PRINT_UNICODE_PATTERN, $input);
}
print ctype_print_unicode("3 muços?"); // 1
从开始,我假设您希望保留所有字母(L)、标记(M)、数字(N)、标点符号(p)、符号(S)和空格(Z),并转储所有其他内容(如控制字符)。因此,regexp为:
$out=preg_replace('/[^\pL|\pM|\pN|\pP|\pS|\pZ]/u','',$in);
似乎是在耍花招
[编辑]
好吧,这不适用于提供的
$in=urldecode('%EF%B8%8F');
示例(解码为Unicode代码点。以下代码处理该代码:
$len=mb_strlen($in);
$out='';
$disallowedTypes=[IntlChar::CHAR_CATEGORY_NON_SPACING_MARK];
for ($i=0;$i<$len;$i++) {
$char=mb_substr($in,$i,1);
$type=IntlChar::charType($char);
if (false===in_array($type,$disallowedTypes)) {
$out.=$char;
//print 'Adding ord '.dechex(IntlChar::ord($char)).' which is '.IntlChar::charType($char).PHP_EOL;
}
}
$len=mb\u strlen($in);
$out='';
$disallowedTypes=[IntlChar::CHAR_CATEGORY_NON_spating_MARK];
对于($i=0;$iIt似乎在大部分时间都有效,但我不确定我是否理解原因!它在某些字符上也会失败,例如print ctype\u print\u unicode(urldecode(“%E0%BF%94”);