PHP 需要正则表达式才能执行以下操作:
我想允许 [a-zα-ωá-ź-яա-ֆა-ჰא-ת] 和中文,日文(更多utf-8)字母; 我想禁止 [^ 98765432100123456789] (阿拉伯数字);
这就是我所做的:
function isValidFirstName($first_name) {
return preg_match("/^(?=[a-zα-ωá-źа-яա-ֆა-ჰא-ת]+([a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+)?\z)[a-zα-ωá-źа-яա-ֆა-ჰא-ת' -]+$/i", $first_name);
}
它看起来很有效,但是如果我输入超过1种语言的字母,它就不会验证。
示例:АвпаВапапваá-ź约翰 - 没有验证。 约翰格格 - 验证,á-źá-ź - 验证。
我想要所有这些。
或者,如果有办法,如果用户输入了更多的语言字符串,则回显消息。
答案 0 :(得分:2)
您可以使用RegEx检查以下方式过滤掉阿拉伯字符:
if (preg_match('/(?:[\p{Hebrew}]+)/imu', $subject)) {
# Successful match
} else {
# Match attempt failed
}
RegEx解释
<!--
(?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) «+»
-->
答案 1 :(得分:2)
我无法重现这里的失败案例(Авпа Вапапва á-ź John
验证就好了),但你可以大量简化正则表达式 - 你不需要那个先行断言:
preg_match('/^[a-zα-ωá-źа-яա-ֆა-ჰא-ת][a-zα-ωá-źа-яա-ֆა-ჰא-ת\' -]*$/i', $first_name)
就我所知的字符范围而言,您不需要排除数字,因为这些字符类之外的任何内容都会导致正则表达式失败。
另一个考虑因素:如果您的目标是允许来自任何语言/脚本的任何字母(加上一些标点和空格),您可以(如果您使用的是Unicode字符串)进一步简化为:
preg_match('/^\pL[\pL\' -]*$/iu', $first_name)
但一般情况下,我不会尝试通过正则表达式(或任何其他方式)验证名称:Falsehoods programmers believe about names。