用于检查字符串是否来自单个脚本的 PHP 正则表达式

标签 php regex unicode preg-match-all

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/

相关文章:

php - 在PHP中获取日期之前的最后一个星期四

linux - UNIX 脚本文件的开头是否允许使用 Unicode 字节顺序标记?

regex - puppet 中用于检查字符串是否包含另一个字符串的函数

java - 在java中检测汉字

ruby-on-rails - 如何替换 Ruby 中带重音的拉丁字符?

PHP PDO try catch block 没有捕获

php - Dompdf - Chroot 无法在目录中找到文件

php - 如何从 foreach 中执行的准备(更新)语句中获取行数

php - 摆脱空白行但保持其他人完整

regex - Angular 和文本掩码 : Regex to validate an input without special characters