Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] preg_match (PROSTE)
Forum PHP.pl > Forum > PHP
koziet
Dla kogoś kto jest obcykany w temacie to będzie śmiesznie proste ale ja nie korzystałem dotychczas z preg_match i proszę o pomoc. Mam ciąg znaków, który powinien składać się wyłącznie z cyrf oraz znaków przecinka, np. "34,5,15,6,122,10,1,8".
Ponadto pierwszy i ostatni znak powinny być cyframi.
Jak napisać pod to preg_match ?
bim2
A nie możesz wykorzystać explode" title="Zobacz w manualu PHP" target="_manual?
zzeus
Nie jestem pewny ale spróbuj coś takiego

  1. <?php
  2. "/^[0-9]{1}([0-9],)+[0-9]{1}$/"
  3. ?>
koziet
Cytat(bim2 @ 2.04.2009, 15:22:26 ) *


A co w przypadku gdy ciąg będzie taki: "2,45,64,d3,aaa,dupa|1" ?

Sorry, zapomniałem dodać, że ciąg może się również składać z pojedynczej cyfry lub liczby i też będzie poprawny więc poprawne będzie np: "3,67,1,8" ale też samo "3" lub "333"
pyro
dalej explode ;p + ewentualnie filtr tablicy smile.gif
koziet
Nie chcę explode. Chcę preg_match.
Zapomniałem jeszcze dodać, że prawidłowy ciąg może się również składać z pojedynczej cyfry lub liczby. Czyli poprawne będzie np: "1,34,8,99,121" ale też "3" lub "333"
Niepoprawne będzie np: ",1,34,8,99,121" - "333," - "4,5,6,a" - ""
bim2
Takim tonem "Nie chce... Chce" i żądania później to w dziale ofert. Nie tutaj. Pokaż co napisałeś, a pokażemy błąd.
ikssde
Ale ignorant, przecież rozbić ten ciąg explode i potem sprawdzić każdą komórkę otrzymanej tablicy pod względem poprawności będzie o wiele prościej.
koziet
To nie miało być "takim tonem". Po prostu uważam, że w tym przypadku preg_match będzie dużo bardziej elegancka niż rozwalanie ciągu za pomocą explode i badanie każdego elementu.

Po co mam pisać kilka linii kodu jak wystarczy jedna, która jest czytelniejsza i wydajniejsza.

Myślę, że wystarczająco opisałem problem.
Nie pokażę co napisałem bo nic nie napisałem. Opisałem problem i czekam aż jakaś mądra głowa pomoże mi go rozwiązać.
ikssde
Nie wiem jak chcesz to zrobić skoro nie wiesz ile takich elementów będziesz miał, jakieś propozycje?
koziet
Skoro nie wiesz to po co nabijasz sobie punkty na forum?

A co do propozycji to wystarczy określić warunek, że pierwszy i ostatni znak w ciągu muszą być cyframi [0-9] a wszystko co pomiędzy nimi to albo cyfry albo znak przecinka tylko, że nie wiem jak utworzyć taki pattern dla preg_match()

Już sam sobie poradziłem:
  1. <?php
  2. $pattern = "/^[0-9][0-9,]*[0-9]$/";
  3. $string  = "92,8,3,7,66,345";
  4.  
  5. if (preg_match($pattern, $string)) {
  6.   echo 'tak';
  7. }
  8. else {
  9.   echo 'nie';
  10. }
  11. ?>
nospor
Cytat
Ale ignorant, przecież rozbić ten ciąg explode i potem sprawdzić każdą komórkę otrzymanej tablicy pod względem poprawności będzie o wiele prościej.
ignorant to moze jestes ty.... poto wymyslono wyrazenia regularne by w latwy sposob sprawdzic tekst a nie bawic sie w kombinacje z explode , latanie w petli po elementach i sprawdzanie kazdego po kolei.
megawebmaster
Który i tak trzeba byłoby sprawdzić w preg_match'em :]
szagi3891
Ja bym natomiast zaproponował wyrażenie :
#^[0-9]([0-9,]*[0-9])?$#si

Obejmuje ono również przypadki gdu nie ma żadnego przecinka. Można to szybko sprawdzić uruchamiają poniższy skrypt :

  1. <?php
  2. print "<pre>";
  3. $dane = array();
  4.  
  5. $dane[] = '34,5,15,6,122,10,1,8';
  6. $dane[] = '34,5,15,6,122,10,1.8';
  7. $dane[] = '34,5,15,6,1g22,10,1,8';
  8. $dane[] = '34,5,1dfgfd5,6,122,10,1,8';
  9. $dane[] = '34,5,15,6,122,10gdfg,1,8';
  10. $dane[] = '34,5,15,6,dfgfdgd122,10,1,8';
  11. $dane[] = '34,5,15,6,122,10,1,8,';
  12. $dane[] = '3aasasas,5,15,6,122,10,1,8,';
  13. $dane[] = '34,5,15a,6,122,10,1,8,';
  14. $dane[] = 'ę34,5,15,6,122,10,1,8,';
  15. $dane[] = '34,5,15,6,1sdfsdfsd22,10,1,8,';
  16. $dane[] = '34,5,1225,12126,122,121120,11232,8';
  17. $dane[] = '3,8';
  18. $dane[] = '3';
  19. $dane[] = '3.0';
  20.  
  21.  
  22. foreach ($dane as $key => $val) {
  23.    
  24.    if (preg_match('#^[0-9]([0-9,]*[0-9])?$#si', $val))
  25.        print 'ok ';
  26.    else
  27.        print '.. ';
  28.  
  29.  
  30.    if (preg_match('#^[0-9][0-9,]*[0-9]$#si', $val))
  31.        print 'ok ';
  32.    else
  33.        print '.. ';
  34.  
  35.        
  36.    print '- ' . $val . "\n";
  37.    }
  38.  
  39. print "</pre>";
  40. ?>
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.