Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg_match zwracajacy znak ktory wystapil a nie powinien
Forum PHP.pl > Forum > PHP
misty
Czesc, mam prosta funkcje do walidacji:

  1. public function checkSimpleField($value) {
  2.  
  3. $safeChars = false;
  4. $pattern = "/^[a-zA-Z0-9-,_ ()]+$/";
  5.  
  6. if (preg_match($pattern, $value) == 1) {
  7. $safeChars = true;
  8. }
  9. return $safeChars;
  10. }


Dziala ok, ale ja bym chciala dostac jeszcze jakos nielegalne znaki (czyli te spoza $pattern) ktory wystapily. Czy jesli $value bedzie mialo wartosc: ";";; no to jak wykryc ze to wlasnie ";";; sa tymi niedozwolonymi znakami? Mam nadzieje ze rozumiecie o co mi chodzi.

pzdr,
misty
thek
Problem w tym, że byś musiała znaleźć wszelkie możliwe wystapienia funkcji sprawdzającej, bo skończy się przebudową lekką tego co funkcja zwraca. W chwili obecnej masz zwracane true lub false... A powinno w przypadku wykrycia znaków niewłaściwych zwrócić także to, co uznało za nieprawidłowy wedle Twojego pomysłu. Możesz to rozwiązać na 2 sposoby:
- lekka przebudowa obecnej funkcji, która po prostu ze stringa bazowego usunie poprawne znaki
- większa, która zadziała na "odwrotnej" zasadzie niż obecna, bez użycia preg_match, ale z użyciem preg_replace.

Skupię się na tym drugim (bo pierwsze też można prosto z użyciem preg_replace osiągnąć).
- bierzemy string bazowy,
- usuwamy z użyciem preg_replace wszystkie prawidłowe znaki (zamieniamy je na pusty string),
- jeśli ostateczny string jest pusty, zwracasz że wszystko OK
- jeśli ostateczny string nie jest pusty, to znaczy, że złapał niedozwolone i zwracasz sygnał błędu + możesz zwrócić dodatkowo string pozostały z operacji usuwania... Zauważ, że teraz musisz w funkcjach walidujących uważac CO zwraca sprawdzenie. Jeśli będzie to dana złożona (tablica lub obiekt) mamy do czynienia z błędem. Jeśli bool, to niemal na mur beton będzie to powodzenie.

Możesz dla jednolitej struktury zwrócić od razu daną złożoną, gdzie pierwszy parametr będzie oznaczał powodzenie lub nie, a drugi ewentualną pozostałość po czyszczeniu z dozwolonych (co jest IMHO prostsze do implementacji w już istniejącym kodzie). By było ładniej z pozostałością, możesz przykładowo użyć count_chars ( $pozostałe , 3 ), co zwróci od razu te znaki już jako unikalne, niezależnie od ilości wystąpień.
misty
czesc, pomysly sa spoko-ale sprowadza sie to do mojego poczatkowego pytania - jak wykryc znaki? zeby zrobic str_replace - to przeciez musze wiedziec czego str_replace - awiec musze mu podac poprawne/niepoprawne znaki jako argument. Majac String:

124iyjhgfyhr;0989ug

jak ja moge wykryc ze poprawne to sa 124iyjhgfyhr0989ug ?

rozumiesz o co mi chodzi?

Przyrzalam sie blizej temu preg_replace i majac taki kod:

  1. $pattern = "/^[a-zA-Z0-9-,_ ()]+$/";
  2. $replace = "";
  3. $subject = "this is only a test ?";
  4.  
  5. print_r(preg_replace($pattern, $replace, $subject));


to mi nie zadziala jak powinno. zwroci mi "this is only a test ?". A wg tego powinien chyba zwrocic sam '?'

W dokumentacji pisza:
If matches are found, the new subject will be returned, otherwise subject will be returned unchanged or NULL if an error occurred.

czyli on nie znajduje matches? czy on traktuje $subject jako calosc, tzn szuka matches dla calego $subject? No bo ja potrzebuje czegos co by sprawdzalo znak po znaku..
redeemer
A może:
  1. function checkSimpleField($value) {
  2.  
  3. $safeChars = true;
  4.  
  5. $pattern = "/[^a-zA-Z0-9-,_ ()]+/"; // tu negacja wyrazenia
  6. $matches = array();
  7. if (preg_match_all($pattern, $value, $matches)) {
  8. var_dump($matches); // moze z tym cos zrobisz
  9. $safeChars = false;
  10. }
  11. return $safeChars;
  12. }
abort
1. Ty definiujesz, które znaki są prawidłowe
2. masz funkcję, która ma jedną wartość jako parametr, jak również zwraca jedną wartość

Rozumiem, że funkcja zwróci true, jeśli parametr zawiera tylko i wyłącznie poprawne znaki i false jeśli parametr będzie zawierał choć jeden niepoprawny znak, to zaczynam się zastanawiać, jak z funkcji (skonstruowanej jak na listingu) chcesz zwrócić listę niepoprawnych znaków zawartych w parametrze?

Po mojemu masz dwa rozwiązania:
1. zwracasz tablicę zawierającą dwa elementy
2. przekazać do funkcji parametr przez referencję - ale to zniszczy wartość oryginalną, także poza funkcją
3. zwrócić listę znaków niedozwolonych i poza funkcją testować, czy ciąg znaków jest pusty (i wtedy mamy TRUE) czy nie (dostajemy FALSE) - ale to jest dodatkowy narzut przy teście, np. na wykonanie funkcji strlen

Który wybierzesz - zależy od Ciebie.
misty
@abort - nie chodzilo mi o rady jak zmienic funkcje, czy ma ona zwracac false, true, dwie wartosci czy 10. Umiem sobie zmodyfikowac kod tak, by dzialal jak potrzebuje. To o co pytalam, to jak ZNALEZC niewlasciwe znaki.

redeemer - dzieki, wlasnie tego szukalam! smile.gif


pzdr,
misty
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.