Regex veriyor sadece 1 karakter

6 Cevap php
$rex = '/^[^<,"@?=>|;#]$/i';

Ben bu düzenli ifade ile sorun yaşıyorum. Fikir giriş alanları belirli karakterleri için kontrol ve eğer varsa, bir hata atmak olmasıdır.

Bu regex 1 karakteri daha uzun, her dizesi hataları atıyor. Herkes yanlış ne yapıyorum bana söyleyebilir?

EDIT: İnsanlar bunu regex ile ne yapmak istediğinizi görmüyorum diyorsun. Ne yapmak istiyorum aşağıdaki karakterlerden biri girdi dize parçası ise girişi reddetmektir:

< >, "@ = |;? #

EDIT2: JG en "geçerli" regex hile yok.

6 Cevap

Eğer exactly bir karakter kabul edilir anlamına gelir, başında sizin ifade ve ^ sonra $ var.

EDIT (yorumlarına dayanarak):

Eğer giriş alanları only valid karakter varsa (Eğer maç, hiçbir geçersiz karakterler var demektir) bu karşı eşleştirerek, görmek için deneyebilirsiniz:

$rex = '/^[^<,"@$?=>|;#]+$/i'

Ayrıca, yani ters yapmak testi girdi alanları kaos tarafından sağlanan regex kullanarak, any invalid karakter varsa yapabilirsiniz:

$rex = '/[<,"@$?=>|;#]/';

Regex eşleşirse Bu şekilde, o zaman geçersiz karakterler var demektir.

Ne muhtemelen gerçekten ihtiyacınız olduğunu:

$rex = '/[<,"@$?=>|;#]/';

Öyle değil değil bu regex, maçlar o zaman hata durumdur.

Bu şu anda regex için bu küçük değişiklik ile ne yaptığınızı yapmaya eşdeğerdir:

$rex = '/^[^<,"@?=>|;#]*$/i';

Bu tür nonsensically olsa, overcomplex edilir. Bu sayı şey oda sayısı olarak aynı olup olmadığını görerek, sonra bir fil odasında filler olmayan kaç şey sayarak oda var olup olmadığını bulmaya çalışıyor gibi. (Ve /i değiştirici bir şey yerine, herhangi bir zamanda, değil.)

Sen yalnızca bir karakter için soruyorsun. Birden fazla karakter istiyorsanız, desen bu ya gibi, (bir veya daha fazla defa) tekrarlanan olsun:

 $rex = '/^[^<,"@?=>|;#]+$/i';

ya bu (sıfır veya daha fazla kez) gibi:

 $rex = '/^[^<,"@?=>|;#]*$/i';

Sen '/^[^<,"@$?=>|;#]+$/i' veya '/^[^<,"@$?=>|;#]*$/i' isteyeceksiniz.

Örnek olarak:

$valid = 'Hello';
$invalid = 'h<i';
$regex = '/^[^<,"@$?=>|;#]+$/i';

print "'$valid' gives ".preg_match($regex, $valid)."\n";
print "'$invalid' gives ".preg_match($regex, $invalid)."\n";

Hangi çıkışlar:

'Hello' gives 1
'h<i' gives 0

Ne yaptım sadece ifadenizi almak ve karakter grubuna sonra + veya * eklemek oldu.

Düzenli ifadelerde, * maç 0 veya daha fazla tekrarlarını anlamına gelir, ve + maç 1 veya daha fazla demektir.

^ + Veya * olmadan dize başlangıcını $ ve sonu demektir beri, sen, o olmayan bir özel karakterin tam olarak bir oluşum oluşan bir dize maç için söylemek böylece neden bu hataları sizin dize uzun bir daha olursa karakter.

İsterseniz hiçbir harfleri ifadede söz konusu olduğunda, bir harf duyarsız maç yapmak gerekmez gibi, siz de, ifadenin sonunda i kaldırabilirsiniz.

Normal ifadeler hakkında daha fazla bilgi için, Regular-Expressions.info bakabilirsiniz.

^ means beginning of line
$ means end of line
[] means match one out of a group of character

Sen bir ve tek olduğunu listesinde yer içeren satırları maç olacak.

belki "/(.*?)[^<,"@$?=>|;#]/i" veya "/^[^<,"@$?=>|;#].*+$/i"

Yapmaya çalıştığınız tam olarak ne olduğunu bilmiyorum