M3AAWG(消息、恶意软件和移动反滥用工作组)发布了“Unicode 滥用预防最佳实践”的说明:
我想实现这个检查:用户名字段(PHP)满足这个条件:
All characters in each identifier must be **from a single script** or from the combinations:
- Latin + Han + Hiragana + Katakana
- Latin + Han + Bopomofo
- Latin + Han + Hangul
虽然组合部分看起来很容易编码:
$nonLatinHanHiraganaKatakana = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Hiragana}\\p{Katakana}]/u', $value);
$nonLatinHanBopomofo = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Bopomofo}]/u', $value);
$nonLatinHanHangul = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Hangul}]/u', $value);
// If none of the allowed combinations by M3AAWG, then reject
if ($nonLatinHanHiraganaKatakana && $nonLatinHanBopomofo && $nonLatinHanHangul)
{
// REJECT
}
是否有一种简单的方法来检查字符串是否来自单个脚本? (仅表示 {latin}、{greek} 等...不管它是什么?
琐碎的工作人员似乎正在逐个检查每个脚本,但有数百个,而且看起来不实用,也没有性能值(value)。也许有一种方法可以在给定“用户名”中的每个字符的情况下获取“脚本”?那么检查是否有多个?
最佳答案
他们肯定不是一群 打击。如果他们是标准 承载者,让他们提供一个列表 您或任何人允许的组合 可以用来构造一个正则表达式。和, 做一个没有错 单个正则表达式。
^(?>[\p{拉丁语}\p{汉语}\p{平假名}\p{片假名}]+|[\p{拉丁语}\p{汉语}\p{Bopomofo} ]+|[\p{拉丁文}\p{韩文}\p{韩文}]+)$
展开
^
(?>
[\p{Latin}\p{Han}\p{Hiragana}\p{Katakana}]+
|
[\p{Latin}\p{Han}\p{Bopomofo}]+
|
[\p{Latin}\p{Han}\p{Hangul}]+
# Add as many as you need
# | \p{..}
)
$
关于用于检查字符串是否来自单个脚本的 PHP 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36984891/