正则表达式匹配阿拉伯语或英语名称

时间:2017-11-15 13:31:46

标签: php regex arabic

我想要一个能够匹配只允许字符(字母)和空格的阿拉伯语OR英文名称的正则表达式,我找到了一个可以完成工作的JavaScript RegEx

var regex = /^(?:[a-zA-Z\s\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDCF\uFDF0-\uFDFF\uFE70-\uFEFF]|(?:\uD802[\uDE60-\uDE9F]|\uD83B[\uDE00-\uDEFF])){0,30}$/;

我将其转换为PCRE兼容

/^(?:[a-zA-Z\s\x{600}-\x{6FF}\x{750}-\x{77F}\x{8A0}-\x{8FF}\x{FB50}-\x{FDCF}\x{FDF0}-\x{FDFF}\x{FE70}-\x{FEFF}]|(?:\x{D802}[\x{DE60}-\x{DE9F}]|\x{D83B}[\x{DE00}-\x{DEFF}])){0,70}$/u

然而,当我尝试

var_dump(preg_match('/^(?:[a-zA-Z\s\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{08A0}-\x{08FF}\x{FB50}-\x{FDCF}\x{FDF0}-\x{FDFF}\x{FE70}-\x{FEFF}]|(?:\x{D802}[\x{DE60}-\x{DE9F}]|\x{D83B}[\x{DE00}-\x{DEFF}])){0,70}$/u', 'Foo Bar'));

OR

var_dump(preg_match('/^(?:[a-zA-Z\s\x{600}-\x{6FF}\x{750}-\x{77F}\x{8A0}-\x{8FF}\x{FB50}-\x{FDCF}\x{FDF0}-\x{FDFF}\x{FE70}-\x{FEFF}]|(?:\x{D802}[\x{DE60}-\x{DE9F}]|\x{D83B}[\x{DE00}-\x{DEFF}])){0,70}$/u', 'Foo Bar'));

它返回

  

PHP警告:preg_match():编译失败:第1行的php shell代码中的偏移量127处不允许使用Unicode代码点(> = 0xd800&&< = 0xdfff)   布尔(假)

请帮助解决此警告!

任何帮助表示赞赏! 谢谢!

1 个答案:

答案 0 :(得分:1)

如果用字母表示语言主要是28个字符,你甚至不必构建基于代码点的字符类(你可以通过手动输入字母来构建它!)。

但如果你的意思是Arabic0600 - 06FF 255 个字符)那么这个长字符类并不能提供你想要的东西

无论如何你可以坚持下去:

/^(?!.*\d)[a-z\p{Arabic}\s]+$/iu

注意:您可能想要检查阿拉伯语脚本here中的不同块。