yaro25
16.12.2017, 13:24:11
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.
Tomplus
16.12.2017, 18:48:02
https://regex101.com/r/53nzyz/1Może trochę pomoże acz więcej niż \d{1}[.,]\d{2} nie zrobię, bo nie wiem jak wykluczyć Ci 0[.,]00
yaro25
16.12.2017, 19:23:00
@Tomplus: dziękuje za sugestie.
czy ktoś może coś jeszcze dodać?
trueblue
16.12.2017, 19:33:09
Kod
(?!(0){1,}.0{1,})\d+(\.|,)\d+
SmokAnalog
16.12.2017, 19:37:09
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+
trueblue
16.12.2017, 19:42:18
W moim, a co za tym idzie Twoim, jest błąd. Może się doszukasz.
SmokAnalog
16.12.2017, 19:51:01
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.
trueblue
16.12.2017, 20:01:20
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.
Pyton_000
16.12.2017, 20:03:11
masakra.... po co tak kombinować?
zamieniasz `,` na `.` a potem `(float)$liczba > 0`
i koniec.
SmokAnalog
16.12.2017, 20:08:22
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:
<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:
$number = '666 dzikie węże';
if ((float) $number > 0) {
// Wszystko cacy. Czy aby na pewno?
}
trueblue
16.12.2017, 20:13:10
Cytat(SmokAnalog @ 16.12.2017, 20:05:00 )

Do tego jest input typu number ze zmiennoprzecinkowym atrybutem step i odpowiednim min:
<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.).
SmokAnalog
16.12.2017, 20:17:28
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).
viking
16.12.2017, 20:47:56
Po co tak kombinować jak jest number_format?
SmokAnalog
16.12.2017, 20:51:50
Cytat(viking @ 16.12.2017, 20:47:56 )

Po co tak kombinować jak jest number_format?
Co ma piernik do wiatraka?
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.
SmokAnalog
17.12.2017, 00:56:48
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?
trzczy
17.12.2017, 07:51:15
Serio macie problem z tym regexem? ;p
(?<![,\.\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/
yaro25
18.12.2017, 22:47:39
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.
Pyton_000
18.12.2017, 23:30:06
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...
SmokAnalog
19.12.2017, 00:57:17
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.
yaro25
19.12.2017, 09:32:55
@Pyton_000: tak jak napisałem, po stronie serwera PHP, <strong>już jest.</strong>
@SmokAnalog: w sumie racja. Czy proponujesz coś lepszego?
trzczy
19.12.2017, 15:13:18
Cytat(yaro25 @ 18.12.2017, 22:47:39 )

wygląda na bardzo detaliczne i szczegółowe, ale niestety po wklejeniu tego w pattern w HTML5, poprostu nie działało.
Bo źle wkleiłeś. I to nie ma nic wspólnego z HTML5.
Swoją drogą to w mym patternie jeszcze brakuje wyłapywania czegoś takiego:
Na koniec roku miał średnią 5.0.
Ale chyba wystarczy tam dodać czwartą alternatywę.
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.