Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的字符串比较”;“空白”;PHP中的Unicode字符_Php_Unicode - Fatal编程技术网

“的字符串比较”;“空白”;PHP中的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序列(英语、汉语、阿拉伯语等) 有些人建

我试图检测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”);