Php 预赛永远不会过去

Php 预赛永远不会过去,php,preg-match,Php,Preg Match,我的帐户创建脚本的名称输入通过preg\u match验证,因为该字段只允许包含拉丁字符或西里尔字符(换句话说,它不能同时包含两个字符),但是,无论名称字段包含什么,都永远不会满足preg\u match条件。到目前为止,我已经尝试了三种可能的代码变体: if (!(preg_match('/^[a-z]$/i',$_POST['name']) || preg_match('/^[а-я]$/i',$_POST['name']))) back('The message'); if (!preg

我的帐户创建脚本的名称输入通过
preg\u match
验证,因为该字段只允许包含拉丁字符或西里尔字符(换句话说,它不能同时包含两个字符),但是,无论名称字段包含什么,都永远不会满足
preg\u 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比赛塞进一个


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

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

/^[a-z]$/i
将其更改为:

/^[a-z]+$/i


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

/^[a-z]$/i
将其更改为:

/^[a-z]+$/i


为了便于阅读,让我们将那些
preg\u match
函数抽象为
是拉丁语
是西里尔语
。然后,您将寻找逻辑:

if is_latin xor is_cyrillic     -> OK
else                            -> not OK
或者,倒过来:

if !(is_latin xor is_cyrillic)  -> not OK
xor
仅当一个为
true
而另一个为
false
时才为true

此外,您的正则表达式只匹配一个字符。您需要
/^[a-z]+$/i
匹配整个单词。此外,为了匹配非拉丁语单词/regex,您需要使用
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
}
if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {

为了便于阅读,让我们将那些
preg\u match
函数抽象为
是拉丁语
是西里尔语
。然后,您将寻找逻辑:

if is_latin xor is_cyrillic     -> OK
else                            -> not OK
或者,倒过来:

if !(is_latin xor is_cyrillic)  -> not OK
xor
仅当一个为
true
而另一个为
false
时才为true

此外,您的正则表达式只匹配一个字符。您需要
/^[a-z]+$/i
匹配整个单词。此外,为了匹配非拉丁语单词/regex,您需要使用
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
}
if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {

您也可以在一个正则表达式中声明这两个:

if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) {
    // error
}
if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {
请注意两个
|
备选方案,bot受
^
$
约束


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

您也可以在一个正则表达式中声明这两个:

if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) {
    // error
}
if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) {
请注意两个
|
备选方案,bot受
^
$
约束


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

根据您的条件,如果第一个“if”没有通过,第二个也不会通过,因为它们是等效的
!(A或B)!A&&!B
您需要的是一个异或

此外,您只需在此处使用“preg匹配”测试一个字符

你的情况应该是

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

   // do what you want

  }

根据您的条件,如果第一个“如果”不通过,第二个也不会通过,因为它们是等效的
!(A或B)!A&&!B
您需要的是一个异或

此外,您只需在此处使用“preg匹配”测试一个字符

你的情况应该是

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

   // do what you want

  }

是否尝试在preg中启用utf模式
../iu
@MarcB感谢您的回复,但它不起作用。是否尝试在preg中启用utf模式
../iu
@MarcB谢谢你的回复,但它没有起作用。因为我很久以前花了相当多的时间学习正则表达式,所以我没有注意到这一点,这真是令人尴尬;一定累了。非常感谢你!因为我很久以前花了相当多的时间学习正则表达式,所以我没有注意到这一点,这真是令人尴尬;一定累了。非常感谢你!这就是为什么我说这只是我试图解决这个问题的两个变体。这就是为什么我说这只是我试图解决这个问题的两个变体。