preg_match永远不会通过

时间:2012-11-08 16:45:04

标签: php preg-match

我的帐户创建脚本的名称输入使用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匹配填充为一个。

有人可以帮我解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

问题在于您将名称限制为一个字符:

/^[a-z]$/i

将其更改为:

/^[a-z]+$/i

/^[а-я]+$/i

答案 1 :(得分:1)

为了便于阅读,我们将这些preg_match函数抽象为名称is_latinis_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

  }