Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]wyciągnięcie tylko liter i cyfr z ciągu
Forum PHP.pl > Forum > Przedszkole
świeżak
Cześć,

Próbuję wyciągnąć tylko litery, cyfry i -_ z loginu, niestety mi to nie wychodzi.

Przy rejestracji chciałbym, aby użytkownicy podając login !@$^.<>"{Swieza+}k_13<<?
otrzymali tylko Swiezak_13.

próbuję w taki sposób :

Kod
$login=htmlspecialchars($_POST['login']);
        $login=ereg('[a-zA-Z0-9._-]', $login);


Niestety nie działa, próbowałem preg_match, preg_match_all, preg_replace niestety patrzę na manual i nie widzę czegoś takiego co usunie mi niepotrzebne znaki.

Mógłbym napisać wszystkie znaki których nie zezwalam, ale wolałbym wyrażeniem regularnym takim jakie mam podać znaki jakie są zgodne, a resztę usunąć.

Pomożecie?
Ulysess
  1. if(preg_match('/^([a-z0-9_]+)$/i', $_POST['login']))
  2. {
  3. // tralala
  4. }
sada
  1. $login=htmlspecialchars($_POST['login']);
  2. //$login='!@$^.<>"{Swieza+}k_13<<?';
  3. $login_test='';
  4.  
  5. for ($i = 0; $i < strlen($login); $i++) {
  6. if(ereg('[a-zA-Z0-9_-]', $login[$i])){
  7. $login_test.=$login[$i];
  8. }
  9. }
  10.  
  11. echo $login_test;
erix
Za ereg powinieneś warna dostać. tongue.gif
świeżak
Hmm chyba źle wytłumaczyłem.

nie chcę sprawdzać czy takie znaki istnieją w ciągu lub czy się znajdują.

Chciałbym, aby dane jakie przesłał użytkownik !@$^.<>"{Swieza+}k_13<<?
Zostały zamienione w taki sposób aby wyświetlały się tylko litery, cyfry oraz znaki - i _

Czyli w tym wypadku Swiezak_13


Próbuję teraz tak:
Kod
$login=preg_match('/[0-9A-Za-z-zążśźćęńół]/', $_POST['login']);

Jednak wyświetla mi to 1, więc nie o to mi chodzi.

Może jakieś naprowadzenie do manuala z jakiej funkcji skorzystać?
sada
Sprawdzałeś moje?

Nie muszę dodawać , że trzeba drugą linię odkomentować by testować twój login

Acha i trzeba kropkę dać z ucieczką \.
świeżak
Cytat(sada @ 12.02.2011, 15:24:57 ) *
Sprawdzałeś moje?


Szukam prostszego rozwiązania i wiem że takie jest, wystarczy skorzystać z normalnej funkcji, ale nie potrafię takiej znaleźć.
Więc niestety nie chcę kombinować z Twoim rozwiązaniem.


Jeżeli nie znajdę żadnego rozwiązania, to skorzystam z podmiany wybranych znaków na '', na pewno będzie to lepsze rozwiązanie.


Skoro jest możliwość usunięcia podanych znaków. To na pewno jest też możliwość usunięcia wszystkich znaków nie pasujących do ciągu. Czy się mylę?
MariuszT
  1. $login = ' - @Mar^( )iuszęź!`;-T_5-';
  2.  
  3. echo preg_replace('/[^a-zA-Z0-9-_]/si', '', $login);


@sada, Twoje rozwiązanie jest mega nieoptymalne. Nie używaj strlen w pętli, nie ma powodu żeby używać ereg w pętli. W ogóle nie wolno Ci używać ereg, zapomnij o wszystkich eregach, są wycofywane.

@świeżak, poczytaj o preg_replace. Zakres znaków, które mają zostać podajesz między [ i ]. Wszystkie inne będą usuwane. Pierwszy znak w nawiasach czyli ^ oznacza negację. Gdyby go usunąć to wyrażenie usunęłoby wszystkie znaki wymienione w nawiasach zostawiając wszystkie te, które chcesz usunąć. Czyli tłumacząc prościej, zadziałałoby odwrotnie.
sada
  1. $login='!@$^.<>"{Swieza+}k_13<<?';
  2. $login= preg_replace('/[^a-zA-Z0-9._-]/','', $login);
  3. echo $login
świeżak
Cytat(MariuszT @ 12.02.2011, 15:48:24 ) *
  1. $login = ' - @Mar^( )iuszęź!`;-T_5-';
  2.  
  3. echo preg_replace('/[^a-zA-Z0-9-_]/si', '', $login);


Sada, Twoje rozwiązanie jest mega nieoptymalne. Nie używaj strlen w pętli, nie ma powodu żeby używać ereg w pętli. W ogóle nie wolno Ci używać ereg, zapomnij o wszystkich eregach, są wycofywane.



Dzięki za odpowiedź, właśnie też doszedłem do tego rozwiązania. Ale mimo wszystko dziękuje za pomoc smile.gif

Umnie wygląda to
Kod
$login=preg_replace('/[^A-Za-z0-9-zążśźćęńół_]/', '', $login);
sada
Chciał z eregiem to zrobiłem eregiem
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.