Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] kilka pytań o preg_match
Forum PHP.pl > Forum > Przedszkole
!*!
Jeśli chciałbym aby w zmiennej były tylko litery i liczby to mam coś takiego:

  1. <?php
  2. if(preg_match("/[!@#$%^&*(){}-=+<>.~;\"'/[]|r\n,?“śŧ←↓→ţđ]/",$zmienna))
  3. ?>


Nie można tego jakoś uprościć?

Jak mogę użyć w zmeinnej tylko jednej spacji?

  1. <?php
  2. if(preg_match("/[s{1}]/",$zmienna)
  3. ?>
wookieb
  1. <?php
  2. preg_match('/^[a-z0-9]* [a-z0-9]*$/i', $zmienna);
  3. ?>


A nie lepiej było najpierw poczytać o wyrazeniach regularnych?
no_face
Tylko litery i cyfry, jezeli chcesz polskie ogonki trzeba rowniez dodac.

  1. <?php
  2. preg_match("/[0-9A-Za-z]/",$zmienna);
  3. ?>


Jezeli jedna spacja to moze byc cos takiego

  1. <?php
  2. preg_match("/[0-9A-Za-z] [0-9A-Za-z]/",$zmienna);
  3. ?>
!*!
wookieb - tylko mi nie pisz o manualu który opisuje tyle co nic.

no_face - właśnie z tą spacją jest problem, bo przyjmuje też:

Kod
zxc zxc zxc
wookieb
  1. <?php
  2. $zmienna=str_replace(' ','', $zmienna, $count);
  3. if($count==1 && preg_match('/^[a-z0-9]*$/i', $zmienna))
  4. {
  5.  
  6. }
  7. ?>


Czy ja coś mówiłem o manualu? google.pl -> Wyrażenia regularne
!*!
W większości proponują zmiany na eregi... poza tym nie chce usuwać spacji, tylko mieć możliwość użycia tylko jednej np. przy imieniu dwuczlownowym. A gdy ktoś wpisze wiecej niż jedną wyskoczy błąd.
wookieb
No to u góry podałem ci rozwiązanie na samej górze.
Cytat
wookieb - tylko mi nie pisz o manualu który opisuje tyle co nic.

Nic mówisz?

http://pl2.php.net/manual/pl/regexp.reference.php
http://pl2.php.net/manual/pl/reference.pcr...n.modifiers.php
!*!
to?
Kod
preg_match('/^[a-z0-9]* [a-z0-9]*$/i', $zmienna);


a gdzie jest w tym tylko jedna spacja? przejdzie przez to znacznie więcej. zdawalo mi się że ograniczyć to można w \s{1} tak?
wookieb
Cytat(!*! @ 17.09.2008, 12:17:56 ) *
to?
Kod
preg_match('/^[a-z0-9]* [a-z0-9]*$/i', $zmienna);


a gdzie jest w tym tylko jedna spacja? przejdzie przez to znacznie więcej.

np tutaj? 9]* [a
Zaznacz sobie. Sprawdź. Podziel się refleksjami.

Cytat(!*! @ 17.09.2008, 12:17:56 ) *
zdawalo mi się że ograniczyć to można w \s{1} tak?


Tyż ale to bierze pod uwage wszystkie "białe znaki"
!*!
Kod
if(!preg_match('/^[a-z]* [a-z]*$/i',$imie)

lub
Kod
if(preg_match('/^[a-z]* [a-z]*$/i',$imie)


zastrzel... przejdzie więcej jak nic... o0
wookieb
A może byś jednak kurwa sprawdził? Sprawdziłem. Działa. Wiec najpierw zrób a potem "dziel sie refleksjami"
Kod
if(preg_match('/^[a-z0-9]* [a-z0-9]*$/i', '  test eheh   '))
{
echo 'kest';
}

Nie działa
Kod
if(preg_match('/^[a-z0-9]* [a-z0-9]*$/i', 'test eheh'))
{
echo 'kest';
}

A jednak działa... Zamien jeszcze * na + w celu sprawdzenia czy wpisał 2 człony
Cytat
zastrzel...

Z przyjemnością.
drPayton
Albo tak:
  1. <?php
  2. preg_match('/^[a-z0-9]{0,}[:spac:]]{1,1}[a-z0-9]{0,}$/i', $stringToValidate)
  3. ?>


[[:space:]] tam powinno być, ale forum zjada literki :/
bliitz
Cytat(!*! @ 17.09.2008, 12:12:06 ) *
W większości proponują zmiany na eregi... poza tym nie chce usuwać spacji, tylko mieć możliwość użycia tylko jednej np. przy imieniu dwuczlownowym. A gdy ktoś wpisze wiecej niż jedną wyskoczy błąd.


http://pornel.net/ereg
no_face
Wybacz, troche sie pospieszylem, tutaj masz kod ktory przepusci tylko ciagi jedno lub dwu wyrazowe, czyli usera z jednym imieniem lub dwoma:

  1. <?php
  2. preg_match("/^[A-Za-z]+ [A-Za-z]+$|^[A-Za-z]+$/",$imie);
  3. ?>


Jezeli to beda userzy z polski nalezaloby dodac jeszcze polskie egonki do znakow akceptowanych:

Kod
[A-Za-zążśźćęńół]
!*!
wookieb - sorawdzałem, i Twoje przykłady nie działają (prawdopodobnie z mojej bardzo niskiej niewiedzy wstawiania kodu/ironia).
bliitz - tak wiem o tym, myślisz że czemu uparłem się na pregi?
no_face - dzięki, właśnie o to chodziło. Dla innych co szukają:

  1. <?php
  2. if(!preg_match("/^[A-Za-z]+ [A-Za-z]+$|^[A-Za-z]+$/", $imie)){$error = "<span class='error'>Za dużo spacji.</span>";}
  3. ?>
drPayton
Cytat(!*! @ 17.09.2008, 12:40:02 ) *
wookieb - sorawdzałem, i Twoje przykłady nie działają (prawdopodobnie z mojej bardzo niskiej niewiedzy wstawiania kodu/ironia).


Najwyraźniej, bo jak dla mnie to jego przykład działa jak należy...
unloco
Mogę prosić o poradę co się nie zgadza?

  1.  
  2. if (!preg_match("/[a-zA-Z0-9]{3,}{,30}/", $login_uzytkownika))
  3. {
  4. echo "<div class=error>";
  5. echo "Login może składać się tylko z:<br>- dużych i małych liter (bez polskich znaków)<br>- cyfr<br>- nie może być dłuższy niż 30 znaków i krótszy niż 3<br>- musi się zaczynać od litery<br>";
  6. echo "</div>";
  7. $nie_rejestruj_usera = 1;
  8. }
  9.  


Cały czas gdy wpisuję jako login wyraz Unloco2222 to pojawia mi się ten komunikat co powyżej.
drPayton
o, Pan archeolog biggrin.gif

Cytat
"/[a-zA-Z0-9]{3,}{,30}/"

zamień na
Cytat
"/[a-zA-Z0-9]{3,30}/"


reszta jest ok wink.gif

Ograniczenie długości dajesz jedno, albo tylko z minimalną {X,}, albo tylko z maksymalną {,X}, albo oba naraz {X,Y}.
unloco
Mogę jeszcze prosić o skrócenie tego? Bo nigdzie nie mogę znaleźć jak narazie odpowiedzi:

  1. if (!preg_match("/[a-zA-Z0-9]{3,30}/", $login_uzytkownika))
  2. {
  3. echo "<div class=error>";
  4. echo "Login może składać się tylko z:<br>- dużych i małych liter (bez polskich znaków)<br>- cyfr<br>- nie może być dłuższy niż 30 znaków i krótszy niż 3<br>- musi się zaczynać od litery<br>";
  5. echo "</div>";
  6. echo "<br>"; $nie_rejestruj = 1;
  7. }
  8.  
  9. if (preg_match("/[ąśżźćęńłóĄŚŻŹĆŃŁÓ]{3,30}/u", $login_uzytkownika))
  10. {
  11. echo "<div class=error>";
  12. echo "Login może składać się tylko z:<br>- dużych i małych liter (BEZ POLSKICH ZNAKÓW)<br>- cyfr<br>- nie może być dłuższy niż 30 znaków i krótszy niż 3<br>- musi się zaczynać od litery<br>";
  13. echo "</div>";
  14. echo "<br>"; $nie_rejestruj = 1;
  15. }


Żeby zastosować jedno wyrażenie warunkowe to jak trzeba kod zmienić? Bo jeśli jako login ktoś wpisze np. Śliczna to i tak to jest akceptowane. A chodzi o to, żeby nie było. Nawet jeśli usunę drugie wyrażenie warunkowe to i tak polskie litery są akceptowane. Proszę o pomoc.
drPayton
oj, wprowadziłem Cię niechcący w błąd pisząc, że jest ok - jeden poważny problem tam wystepuje wink.gif
preg_match w postaci takiej, jak zapisałeś w praktyce oznacza, że sprawdzane jest, czy w ciągu znaków (tu: login użytkownika) jest co najmniej 3-literowy fragment zgodny z podanym wzorcem.
W podanym przez Ciebie przykładzie - "Śliczna" - występuje taki 6-literowy ciąg "liczna".
Ty chcesz sprawdzić, czy cały ciąg jest zgodny ze wzorcem, a więc musisz do wyrażenia regularnego dodać informację o tym, iż sprawdzany musi być cały string - od początku do końca. Należy więc zamknąć go pomiędzy znakami początku i końca "matchowania" ^ oraz $

Po zmianie:
  1. if (!preg_match("/^[a-zA-Z0-9]{3,30}$/", $login_uzytkownika)) (...)

i powinno być już (tym razem wink.gif) wszystko jak należy - drugi IF nie jest już potrzebny
unloco
Wielkie dzięki za pomoc smile.gif
pitrzak
Witam.
Podczepie sie pod temat zeby nie zakladac nowego.

Chce zrobic skrypt, ktory wczytuje tylko dwa pierwsze slowa z kazdej linii podanego tekstu.
Przykladowo tekst jest taki:

Nowak Marek Adam
Kowalski Jan
Zajac Marcin Piotr
...

Chcialbym zeby do tablicy zostaly wpisane tylko nastepujace slowa:

Nowak Marek
Kowalski Jan
Zajac Marcin

Tekst jest podawany z formularza, ilosc linii nieograniczona. Wiem ze musze zastosowac preg_match_all, ale gubie sie we wzorcach.
Prosze o pomoc smile.gif
jaslanin
  1. <form action="" method="post">
  2. <textarea name="txt"></textarea>
  3. <input type="submit" value="Send">
  4. </form>
  5.  
  6. <?
  7.  
  8. if ($_POST) {
  9. preg_match_all("#^[\w]+ [\w]+#m", $_POST['txt'], $matchesarray);
  10.  
  11. foreach($matchesarray[0] as $match) {
  12. echo $match.'<br />';
  13. }
  14. }
  15.  
  16. ?>
pitrzak
No nie wierze... jak szybko i prosto.

Dziekuje i gratuluje wiedzy smile.gif
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.