eregi() i same litery w zmiennej

0

Witam, mam takie problem że potrzebuję sprawdzić zmienną pod kątem występowania cyfr lub innych znaków. Chodzi mi o to że mają w niej być same litery i mam już nawet taką tablicę [^0-9] i powinno wyrzucać błąd gdy wpisze cyfrę lecz nic się nie dzieje. Trochę skomplikowana ta funkcja eregi ;D Prosiłbym o pomoc.

if (eregi("[^0-9]","asder5wbcncn"))
        echo 'pasuje';
else
	echo 'nie pasuje';
0

Nie używaj funkcji eregi ani innych z rodziny ereg. Zamiast tego używaj funkcji rozpoczynających się od preg_, w tym wypadku użyj preg_match. Ludzie, czytajcie manual PHP, tam o takich rzeczach piszą! (zobacz sam)

Poczytaj też o wyrażeniach regularnych. To ich używa się w funkcjach typu ereg czy preg. Napisz wyrażenie regularne, które upewni się, że cały podany mu ciąg znaków składa się z jednej lub więcej cyfr. Zmień odpowiednio warunek -- jeśli wyrażenie zostanie dopasowane (czyli masz same cyfry), to jest OK, a jak nie zostanie dopasowane, to wtedy jest błąd.

Pamiętaj o zakotwiczeniu wyrażenia regularnego, tj. wstawieniu na jego początku kotwicy dopasowującej początek wejścia, a na końcu -- dopasującej koniec wejścia (są to odpowiednio ^ oraz $).

Wyrażenia regularne to ekstremalnie potężne narzędzie, obecne w wielu różnych językach programowania. Po prostu opłaca się ich nauczyć. Masz je w PHP, masz w JavaScripcie. Ale również w Javie, C# i w wielu innych językach. Tam masz podobne funkcje/metody/obiekty, tylko nie nazywają się one preg_match, tylko ciut inaczej. Ale przyjmują za argument taki sam format ciągu wyjściowego, zwany właśnie wyrażeniem regularnym.

Wyrażenie, które napisałeś:

[^0-9]

Dopasowuje pojedynczy znak, który jest czymkolwiek, tylko nie znakiem z zakresu 0-9. Czyli dopasuje to jeden znak, który nie jest cyfrą. Nigdzie jednak w wyrażeniu nie zaznaczyłeś, że ten znak musi wystąpić na początku czy na końcu ciągu wejściowego, czy że ma to być jedyny znak w ciągu wejściowym. Czyli Twoje wyrażenie dopasuje ciąg "blablabla", bo już na pierwszym miejscu pojawia się nie-cyfra -- znak 'b'. Dopasuje też ciąg "123a456", bo na czwartej pozycji znajduje się nie-cyfra, znak 'a'. Dopasuje też 'x', ale nie dopasuje np. '1' lub '666'. Po prostu wyrażenie to dopasuje każdy ciąg wejściowy, który zawiera przynajmniej jeden znak nie będący cyfrą.

A nie o to Ci chodziło.

Wyrażenie dopasowujące ciąg cyfr jest proste i w miarę szybko powinieneś się nauczyć je tworzyć. Poczytaj tylko o tych wyrażeniach regularnych (ang. regular expressions, w skrócie regex lub regexp). Tutaj masz dobre źródło: http://www.regular-expressions.info/

0

Z tym eregi żeby nie używać, fakt przeoczyłem ;p Ale głównie chodzi mi o to wyrażenie regularne. Czytałem na kilku stronach (m.in. na 4programmers.net ) o nich ale jakoś nie mogę tego załapać ;/ Piszą że zaprzecza zbiór, to dałem [0-9] ale nic to nie daje. Długość zmiennej jest obojętna, ważne by nie zawierała cyfr ani innych znaków.

0

Chcesz się nauczyć regex:

http://www.regular-expressions.info/tutorial.html

Chcesz gotowce:

http://regexlib.com/

0

Przeczytaj uważnie co napisał @bswierczynski:

(...) Dopasowuje pojedynczy znak, który jest czymkolwiek, tylko nie znakiem z zakresu 0-9. Czyli dopasuje to jeden znak, który nie jest cyfrą

Spróbuj na przykład tak: ^[^0-9]*$. W tym momencie, dzięki ^ i $ mamy ograniczenia, a dzięki * - dopasowanie do 0 lub więcej znaków. Taki zapis mówi: zmienna ma się zaczynać, potem ma być 0 lub więcej znaków innych niż 0-9 i ma się skończyć. Jak wystąpi 0-9 to się nie dopasuje, a preg_match zwróci (chyba) false.

Tylko jeszcze jedna uwaga: zaprzeczeniem 0-9 nie są tylko litery. Jeśli chcesz mieć tylko litery to raczej zrób coś takiego: ^[a-z]*$. A wielkie i małe litery przez [a-zA-Z].

0

Czytałem wczoraj jeszcze o tych wyrażeniach regularnych i faktycznie nie jest to aż tak trudna sprawa, tylko po prostu jak zaczynałem programować w PHP to nie miałem zbyt wiele czasu na wszystkie zagadnienia, ale wczoraj usiadłem i testowałem te wyrażenia po kolei. Nie taki diabeł straszny jak go malują :) Dzięki Panowie za pomoc, pozdrawiam.

0

@corey:
Fajnie, że do tego przysiadłeś, bo to Ci się na pewno bardzo przyda. W końcu w programowaniu często przychodzi nam manipulować tekstem. A do tego wyrażenia regularne są bodaj najlepszym narzędziem -- z dobrze wyważoną dawką i prostoty i uniwersalności. Pamiętaj, że wyrażenia regularne masz nie tylko w PHP, ale i w bodaj każdym popularnym języku. Gdy nauczysz się wzorców wyrażeń regularnych w PHP, to będziesz je też umiał tworzyć w Javie, JavaScripcie, C#, Pythonie, Perlu etc. Bywają pewne różnice (głównie na zasadzie że jakaś zaawansowana opcja jest niezaimplementowana, ew. dodano jakieś modyfikatory), ale to raczej drobnostki.

Czas poświęcony regexom NA PEWNO Ci odpłaci. Wydaje mi się, że je stosuję gdzieś tak w połowie (jak nie więcej... może i 3/4?) moich projektów. Niektórzy nie stosują ich w ogóle i zamiast jednej linijki z regexem piszą skomplikowaną funkcję na 20 linii, używając funkcji manipulującymi stringami (pełno jakichś wywołań strpos i substri, a wszystko to w kosmicznej pętli). Regexami praktycznie zawsze wychodzi zwięźlej, a przeważnie jest po prostu łatwiej, mniej skomplikowanie i bardziej niezawodnie.

0

to nie powinno wyglądać tak: ^[0-9]$

1 użytkowników online, w tym zalogowanych: 0, gości: 1