我需要PHP 的正则表达式来执行以下操作:
我想允许 [a-zα-ωá-źа-яա-ֆა-ჰא-ת] 和中文、日语(更多 utf-8)字母;我想禁止 [^٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹](阿拉伯数字);
这是我所做的:
function isValidFirstName($first_name) {
return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?'z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name);
}
看起来它可以工作,但是如果我键入一种以上语言的字母,它不会验证。
示例:Авпа Вапапва á-ź John - 不验证。John Gger - validates, á-ź á-ź - validates.
我想所有这些。
或者,如果有办法,如果用户输入了更多的语言字符串,则回显消息。
我无法在此处重现失败情况(Авпа Вапапва á-ź John
验证得很好),但您可以大大简化正则表达式 - 您不需要该前瞻性断言:
preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת'' -]*$/i', $first_name)
据我从您给出的字符范围可以看出,您不需要排除数字,因为这些字符类之外的任何内容都已经会导致正则表达式失败。
另一个注意事项:如果您的目标是允许来自任何语言/脚本的任何字母(加上一些标点符号和空格),您可以(如果您使用的是 Unicode 字符串)进一步简化它以:
preg_match('/^'pL['pL'' -]*$/iu', $first_name)
但一般来说,我不会尝试通过正则表达式(或任何其他方式)来验证名称:程序员相信名称的虚假。
您可以通过使用正则表达式检查以下方式来过滤掉阿拉伯字符:
if (preg_match('/(?:['p{Hebrew}]+)/imu', $subject)) {
# Successful match
} else {
# Match attempt failed
}
正则表达式解释
<!--
(?i)(?:['p{IsHebrew}]+)
Options: case insensitive; ^ and $ match at line breaks
Match the remainder of the regex with the options: case insensitive (i) «(?i)»
Match the regular expression below «(?:['p{IsHebrew}]+)»
A character in the Unicode block “Hebrew” (U+0590..U+05FF) «['p{IsHebrew}]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
-->