Nasıl preg_match tam olarak çalışır?

3 Cevap php

Ben göndermek dizesi geçerli değil veya "olmalıdır" olmadığını kontrol etmek için basit bir fonksiyon yazmıştım.

// this works without problems
function validate_email ($value) {
    return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value);

}

// this doesn't work
function validate_string ($value) {
    return preg_match ("([^<>?=/\]+)", $value);

}

I validate_email Ben beni dönmek 1 veya 0 değilse geçerli korumak için alışkınım bir e-posta göndermek eğer ilk fonksiyon, iyi çalışıyor.


validate_string should do the same with strings of every kind but without ? = < > / \. If I check the function it return me 1 in anycase, why?

validate_string ("tonino"); // return 1 ok
validate_string ("ton\ino\"); // return 1 why?
validate_string ("ton?asd=3"); // return 1 why?

içeride ^ karakter ([^<>?=/]+) sonra değil karakter demek gerekir (ya da değil?)

3 Cevap

Sizin kod birkaç hatalar vardır. Bunun yanı sıra "ton\ino\" geçerli bir dize değil ve [^<>?=/\]+ muhtemelen bazı mantıksal yanlış anlama var, geçerli bir normal ifade değil.

Değil en az bir karakter varsa düzenli ifade [^<>?=/\\]+ (burada düzeltilmiş) maç olacak <, >, ?, =, / ve \. Yani, en az bir, karakter, preg_match döner olup olmadığını 1. ton\ino" ve ton?asd=3 hem de en az bir adet böyle bir karakteri (maç her iki durumda da bir ton) içermektedirler.

Bunun için bir düzeltme dize başlangıç ​​ve bitiş için iddialarını kullanmak ya olan (^ ve $), sadece tüm dizeyi için yasal karakterlere izin:

^[^<>?=/\\]+$

Ya da olumlu bir karakter sınıfını [<>?=/\\]+ yasadışı karakterlerle eşleşen ve iade ifadesini inkâr kullanmak için preg_match:

function validate_string ($value) {
    return !preg_match("([<>?=/\\\\]+)", $value);
}

Ama yerine kara bir beyaz liste kullanmak kesinlikle daha iyi olurdu.

Sen (^) ve bitiş ($) dize başlangıcını uyan değil. Desen t maçları (ve dizenin kalan alakasız) çünkü Yani "ton?asd=3" eşleşir.

\ bir meta karakter, bunu kaçmak gerekir. Yani olurdu

return preg_match ("([^<>?=/\\\\]+)", $value);