Dlaczego taki kawałek kodu nie działa? Chciałbym żeby w ifie było true wtedy i tylko wtedy kiedy wzorzec występuje dokładnie jeden raz. Jak widać tak nie jest a kod się wykonuje…
if (preg_match('@[a-zA-Z]{1}@','DUPA')) {
echo 'nie dziala';
}
Wprawdzie nie znam PHP, ale jeśli działa to tak jak myślę, to:
/^[a-z]$/ - musi pasować od początku do końca napisu (lub linii zależnie od trybu), czyli chyba to o co Ci chodzi
/[a-z]/ - wystarczy, że gdziekolwiek w napisie znajdzie dopasowanie
“preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match” - czyli zwraca 0 lub 1 w zależności od dopasowania wyrażenia regularnego w źródle. W Twoim przypadu preg_match zwraca Ci 1 (typ int).
nr47 - “{1} jest raczej zbędne” - dlaczego? A jak szuka wystąpienia jednego znaku z podanego zbioru?
M@ster - znacznik /i (case insensitive) powoduje, że nie będzie zwracał uwagi na wielkość liter - nie znając znaczenia tego przełącznika i zapisując “skróconą wersję” wyrażenia regularnego przy dalszych jego modyfikacjach (np.: rozpoznanie, czy imię jest zapisane zgodnie z zasadami pisowni - pierwsza litera jest wielka) początkujący użytkownik może zirytować się niezrozumiałymi zachowaniami.
Jaśniej?
Jeżeli nie, to podpowiem, że szukasz wystąpienia pojedynczego znaku (zapis {1}) z przedziału (a-z) oraz (A-Z)) (zapis [a-zA-Z]) w napisie “■■■■”. Znajduje D, które zawiera się w przedziale i występuje na pozycji 0, więc zwraca 1. Spróbuj zamienić “■■■■” na “12#$”…