我想匹配一组 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 的新手,如果这里有人能发现我忽略的任何漏洞,我将不胜感激。
我可以确认十六进制范围匹配 unicode 代码点而不是实际的十六进制值(即欧元符号的 x20ac 而不是 xe282ac 是正确的)?
我可以混合文字字符和十六进制值,如 preg_match("/[^0-9\x{20ac}]/u", $text)?
谢谢,凯文
请注意,我之前尝试过这个问题,但它被关闭了 - “更适合 codereview.stackexchange.com”,但那里没有回应,所以希望可以以更简洁的格式再试一次。