1

我的帐户创建脚本的名称输入使用 a 进行验证,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

4 回答 4

4

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

/^[a-z]$/i

将其更改为:

/^[a-z]+$/i

/^[а-я]+$/i
于 2012-11-08T16:50:19.533 回答
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

此外,您的正则表达式仅匹配一个字符。你会想要/^[a-z]+$/i匹配整个单词。此外,要匹配非拉丁词/正则表达式,您需要使用u修饰符 like/^[а-я]+$/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
}
于 2012-11-08T16:52:42.647 回答
1

您也可以在一个正则表达式中断言两者:

if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {

请注意两个|替代方案,bot 受^和约束$

还有\p{Latin}, 不仅\p{Cyrillic}用于匹配完整的字符范围。

于 2012-11-08T16:52:57.760 回答
0

根据您的条件,如果第一个“如果”没有通过,第二个也不会通过,因为它们是等价!(A or B) <=> !A && !B的,您想要的是 xor

此外,您只需在此处使用“预匹配”测试一个角色。

你的情况应该是

if( preg_match('/^[a-z]+$/iu',$_POST['name']) xor preg_match('/^[а-я]+$/iu',$_POST['name']){

   // do what you want

  }
于 2012-11-08T16:54:42.073 回答