Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyrażenie regularne, prośba do znawcy tematu
yaro25
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 13.06.2017

Ostrzeżenie: (0%)
-----


Witam, dziękuje za zainteresowaniem tematem.


próbuje znaleść odpowiedźm, jak powinno wyglądać wyrażenie regularne do walidacji cyfry dziesiętnej, uwzględniające:
- tylko cyfry;
- przecinek, kropkę;
- nie mogące zarazem 0.00 lub 0,00

Bardzo będę wdzięczny za pomoc.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


https://regex101.com/r/53nzyz/1

Może trochę pomoże acz więcej niż \d{1}[.,]\d{2} nie zrobię, bo nie wiem jak wykluczyć Ci 0[.,]00
Go to the top of the page
+Quote Post
yaro25
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 13.06.2017

Ostrzeżenie: (0%)
-----


@Tomplus: dziękuje za sugestie.

czy ktoś może coś jeszcze dodać?
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Kod
(?!(0){1,}.0{1,})\d+(\.|,)\d+


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Sprawdź czy liczba ma odpowiedni format, potem zamień ewentualny przecinek na kropkę i sprawdź czy wynikowa liczba jest różna od zera. Nie sprawdzaj wartości liczby wyrażeniem regularnym.

Cytat(trueblue @ 16.12.2017, 19:33:09 ) *
Kod
(?!(0){1,}.0{1,})\d+(\.|,)\d+

Śmiesznie formatujesz wzorzec. Można prościej zrobić to samo:

Kod
(?!0+.0+)\d+[.,]\d+


Ten post edytował SmokAnalog 16.12.2017, 19:37:20
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W moim, a co za tym idzie Twoim, jest błąd. Może się doszukasz.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Tak - dopatrzyłem się, że odrzuca np. 0.01. Nie mówiłem, że jest prawidłowy, tylko że śmiesznie używasz kwantyfikatorów.

Ja podtrzymuję opinię, że lepiej samego sprawdzania czy jest różne od zera nie robić wyrażeniem regularnym. Miło by też było odrzucić liczby poprzedzone zerem (chyba że świadomie je zaakceptować). Ja bym zrobił taki wzorzec:

Kod
(?:0|[1-9]\d*)(?:[.,]\d+)?


Akceptuje liczby zmiennoprzecinkowe i całkowite (tak ma być?), nie toleruje zer z przodu, ale toleruje zerową część ułamkową (tak ma być?).

Tak naprawdę to potrzeba więcej szczegółów.
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Tak, tak, zrozumiałem, też mnie to rozbawiło.

Kod
(?!0+.0+$)\d+[\.|,]\d+


Wydaje mi się, że jest to dobre rozwiązanie (używanie regex) przy sprawdzaniu walidacji inline, np. dla patternów walidacji formularzy w HTML5.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


masakra.... po co tak kombinować?

zamieniasz `,` na `.` a potem `(float)$liczba > 0`

i koniec.
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #10





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 16.12.2017, 20:01:20 ) *
Wydaje mi się, że jest to dobre rozwiązanie (używanie regex) przy sprawdzaniu walidacji inline, np. dla patternów walidacji formularzy w HTML5.

Do tego jest input typu number ze zmiennoprzecinkowym atrybutem step i odpowiednim min:

  1. <input type="number" step="0.01" min="0.01">


Cytat(Pyton_000 @ 16.12.2017, 20:03:11 ) *
masakra.... po co tak kombinować?

zamieniasz `,` na `.` a potem `(float)$liczba > 0`

i koniec.

Chyba nie do końca:

  1. $number = '666 dzikie węże';
  2. $number = str_replace(',', '.', $number);
  3. if ((float) $number > 0) {
  4. // Wszystko cacy. Czy aby na pewno?
  5. }
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Cytat(SmokAnalog @ 16.12.2017, 20:05:00 ) *
Do tego jest input typu number ze zmiennoprzecinkowym atrybutem step i odpowiednim min:

  1. <input type="number" step="0.01" min="0.01">

Pierwsze słyszę żeby input tego typu służył do walidacji i informował Cię, że wprowadzona wartość 0.00 lub 0,00 jest niepoprawna.
Jeśli będziesz chciał wprowadzać wartości ujemne, to zauważysz zapewne, że atrybut min na nic się tu nie zda.

Wciąż mam na myśli wykorzystanie patternu do walidacji na bieżąco i np. informowanie użytkownika, że wprowadził wartość nieprawidłową (czerwona ramka w polu ceny, itp.).


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Moim zdaniem używanie wzorca do tego jest nieeleganckie. Wzorzec powinien dotyczyć struktury, a liczba różna od zera to już wartość i lepiej byłoby to wyraźnie zaznaczyć w kodzie, używając do tego odpowiedniego operatora. Jak za jakiś czas wrócisz do kodu z takim wzorcem, to będzie trudno dojść do tego o co tam chodzi i że to ma zabraniać pewnej wartości liczbowej. Ble, ble, ble.

Wspomniałem o input number po to, że jak już chcemy korzystać z dobrodziejstw walidacji HTML5, to w ten sposób uzyskamy też odpowiedni komunikat o błędzie (że liczba jest np. za mała).
Go to the top of the page
+Quote Post
viking
post
Post #13





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Po co tak kombinować jak jest number_format?


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #14





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(viking @ 16.12.2017, 20:47:56 ) *
Po co tak kombinować jak jest number_format?

Co ma piernik do wiatraka?
Go to the top of the page
+Quote Post
viking
post
Post #15





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Chodziło o ten przykład wyżej z ifem. Natomiast uważam że regexp do tego celu to nieporozumienie.


--------------------
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #16





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(viking @ 16.12.2017, 20:59:59 ) *
Chodziło o ten przykład wyżej z ifem. Natomiast uważam że regexp do tego celu to nieporozumienie.

To teraz już w ogóle nie rozumiem. Co ma funkcja formatująca do walidacji?
Go to the top of the page
+Quote Post
trzczy
post
Post #17





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Serio macie problem z tym regexem? ;p
  1. (?<![,\.\w\d])(?!0[,\.]0)\d+[,\.]\d+(?![,\.\w\d])|(?<![,\.\w\d])0[,\.]0(?=\d*[1-9])\d+(?![,\.\w\d])|(?<![,\.\w\d])(?![0]+)\d+(?![,\.\w\d])
https://regex101.com/r/MXwh3z/3/

Ten post edytował trzczy 17.12.2017, 09:38:35
Go to the top of the page
+Quote Post
yaro25
post
Post #18





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 13.06.2017

Ostrzeżenie: (0%)
-----


Witam Panowie,

dziękuje za tak liczne odpowiedzi: @SmokAnalog, @trueblue, @viking

co do tematu, walidacja odbywałaby się na poziomie HTML5, dlatego rozwiązania po stronie serwera (PHP), poprostu nieuwzględniałem, bo już są.
co do użycia <input type="number" step="0.01" min="0.01"> - to type="number", w HTML5 narzuca wygląd tego inputu na stronie który, nie pasuje do wyglądu mojej strony.
użyłem rozwiązania: (?!0+.0+$)\d+[\.|,]\d+

rozwiązanie: (?<![,\.\w\d])(?!0[,\.]0)\d+[,\.]\d+(?![,\.\w\d])|(?<![,\.\w\d])0[,\.]0(?=\d*[1-9])\d+(?![,\.\w\d])|(?<![,\.\w\d])(?![0]+)\d+(?![,\.\w\d])
wygląda na bardzo detaliczne i szczegółowe, ale niestety po wklejeniu tego w pattern w HTML5, poprostu nie działało.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #19





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Chyba żartujesz.... Poprawna walidacja ma się opierać po stronie PHP a nie HTML. W HTML tylko wstępnie tak aby wykluczyć 90% przypadków, ale zawsze ale to zawsze walidacja musi być przeprowadzona po stronie serwera...
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #20





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(yaro25 @ 18.12.2017, 22:47:39 ) *
użyłem rozwiązania: (?!0+.0+$)\d+[\.|,]\d+

Niezły ten wzorzec, ale na przykład nie daje rady z wartością 0.0.0 - przetestuj.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 04:45