Bir katı takma sıradanifade

3 Cevap php

6 karakter 36, en az bir harf içermelidir: Ben bir takma doğrulamak için normal bir ifade istiyorum. Diğer izin karakterler: 0-9 ve alt.

Bu şimdi ne var:

if(!preg_match('/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i', $value)){
 echo 'bad';
}
else{
 echo 'good';
}

Bu iş gibi görünüyor, ama bu örneğin dizeleri doğrulayıcı:

11111111111a > is not valid, but it should aaaaaaa!aaaa > is valid, but it shouldn't

Bu sıradanifade daha iyi yapmak için herhangi bir fikir?

3 Cevap

Ben aslında iki regex görevi bölmek:

  1. bunun geçerli bir kelime olup olmadığını öğrenmek için: /^\w{6,36}$/i
  2. o bir mektup içerip içermediğini öğrenmek için /[a-z]/i

Ben bu şekilde çok basit olduğunu düşünüyorum.

Bu deneyin:

'/^(?=.*[a-z])\w{6,36}$/i'

İşte orijinal regex sorunların bazıları şunlardır:

/^.*(?=\d{0,})(?=[a-zA-Z]{1,})(?=[a-zA-Z0-9_]{6,36}).*$/i
  • (?=\d{0,}): Bu nedir?? Bu her zaman doğru değildir ve hiçbir şey yapmaz!
  • (?=[a-zA-Z]{1,}): Sen {1,} kısmını gerekmez, sadece one mektup bulmak gerekiyor, ve i bayrak da sağlar ihmal A-Z
  • /^.*: Sen etrafa bu dışında uyan ediyoruz; bunun içinde olmalı
  • (?=[a-zA-Z0-9_]{6,36}).*$: Bu sürece 6-36 \w karakter arasında olduğu gibi, everything else in the rest of the string maçlar demektir! Dize 100 karakter uzunluğunda çoğunlukla yasadışı karakterleri içeren ve hala maç olacak olabilir!

Siz preg_match iki çağrı ile kolayca yapabilirsiniz:

if( preg_match('/^[a-z0-9_]{6,36}$/i',$input) && preg_match('/[a-z]/i',$input)) {
 // good
} else {
// bad
}