我的帐户创建脚本的名称输入使用preg_match
进行验证,因为该字段只允许使用拉丁语或西里尔字符(换句话说,它不能同时包含两者),但是,无论名称字段包含什么,都不会满足preg_match
条件。到目前为止,我已经尝试了三种可能的代码变体:
if (!(preg_match('/^[a-z]$/i',$_POST['name']) || preg_match('/^[а-я]$/i',$_POST['name']))) back('The message');
if (!preg_match('/^[a-z]$/i',$_POST['name']) && !preg_match('/^[а-я]$/i',$_POST['name'])) back('The message');
和一个尝试将preg匹配填充为一个。
有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
问题在于您将名称限制为一个字符:
/^[a-z]$/i
将其更改为:
/^[a-z]+$/i
和
/^[а-я]+$/i
答案 1 :(得分:1)
为了便于阅读,我们将这些preg_match
函数抽象为名称is_latin
和is_cyrillic
。您正在寻找逻辑:
if is_latin xor is_cyrillic -> OK
else -> not OK
或者,倒置:
if !(is_latin xor is_cyrillic) -> not OK
xor
只有在true
而另一个false
时才有效。
此外,您的regexen仅匹配一个字符。您希望/^[a-z]+$/i
匹配整个单词。此外,要匹配非拉丁词/正则表达式,您需要使用u
修饰符,例如/^[а-я]+$/iu
,并确保您的源代码和主题以UTF-8编码。所以:
if (!(preg_match('/^[a-z]+$/i', $_POST['name']) xor preg_match('/^[а-я]+$/iu', $_POST['name']))) {
// error
}
您甚至可以将其缩短为一个正则表达式:
if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) {
// error
}
答案 2 :(得分:1)
你也可以在一个正则表达式中断言:
if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {
请注意两个|
替代方案,机器人受^
和$
约束。
还有\p{Latin}
,而不只是\p{Cyrillic}
用于匹配整个字符范围。
答案 3 :(得分:0)
根据你的条件,如果第一个“if”没有通过,那么第二个也不会因为它们是等价的!(A or B) <=> !A && !B
你想要的是xor
此外,您只需在此处使用“preg match”测试一个字符。
你的病情应该是
if( preg_match('/^[a-z]+$/iu',$_POST['name']) xor preg_match('/^[а-я]+$/iu',$_POST['name']){
// do what you want
}