1

私のアカウント作成スクリプトの名前入力は、フィールドにラテン文字またはpreg_matchキリル文字のいずれかのみを含めることができるため(つまり、両方を含めることはできません)、で検証されますが、名前フィールドに何が含まれていても、条件が満たされることはありません。これまで、コードの3つの可能なバリエーションを試しました。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マッチを1つに詰め込もうとするもの。

誰かがこの問題を修正するのを手伝ってくれませんか?

4

4 に答える 4

4

問題は、名前を1文字に制限していることです。

/^[a-z]$/i

次のように変更します。

/^[a-z]+$/i

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

xortrue一方がであり、もう一方がである場合にのみ真ですfalse

さらに、regexenは1文字のみに一致します。/^[a-z]+$/i単語全体を一致させる必要があります。さらに、ラテン語以外の単語/正規表現と一致させるには、のuような修飾子を使用/^[а-я]+$/iuし、ソースコードと件名がUTF-8でエンコードされていることを確認する必要があります。それで:

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

これを1つの正規表現に短縮することもできます。

if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) {
    // error
}
于 2012-11-08T16:52:42.647 に答える
1

1つの正規表現で両方をアサートすることもできます。

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

|によって制約されたボットという2つの選択肢に注意してください。^$

完全な文字範囲を一致させるため\p{Latin}だけでなく、もあります。\p{Cyrillic}

于 2012-11-08T16:52:57.760 に答える
0

あなたの条件では、最初の「if」が合格しない場合、2番目の「if」も合格しません。これ!(A or B) <=> !A && !Bは、必要なものがxorであるためです。

さらに、ここでは「pregmatch」で1つのキャラクターだけをテストします。

あなたの状態は

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

   // do what you want

  }
于 2012-11-08T16:54:42.073 に答える