Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]Czy dobrze rozumiem to wyrażenie regularne?
Forum PHP.pl > Forum > Przedszkole
adek-
Witam jak w temacie... mam plik schema.xsd gdzie jedna wartość do walidacji jest określana jako
  1. <xsd:element name="tKwZ">
  2. <xsd:simpleType>
  3. <xsd:restriction base="xsd:string">
  4. <xsd:pattern value="\d{0,12}(,{1}\d{2})?"/>
  5. </xsd:restriction>
  6. </xsd:simpleType>
  7. </xsd:element>

czy dobrze je rozumiem... \d{0,12} ma to być jakaś liczba o długości od 0 do 12 cyfr, następnie (,{1}\d{2})? może mieć, ale nie musi "," - przecinek i jedną bądź dwie cyfry po nim?
Nie do końca wiem co oznacza ten znak zapytania na końcu, ale jeśli dobrze to rozumiem to liczba pobierana z bazy 110544,2 powinna działać bez problemu, a wyrzuca mi błąd!
  1. Warning: DOMDocument::schemaValidate(): Element 'tKwZ': [facet 'pattern'] The value '110544,2' is not accepted by the pattern '\d{0,12}(,{1}\d{2})?'.
  2. //oraz
  3. Warning: DOMDocument::schemaValidate(): Element 'tKwZ': '110544,2' is not a valid value of the local atomic type.

Gdy nie pojawia się tam liczba z przecinkien to jest ok, ale jest to pole pokazujące kwoty walutowe więc musi być przecinek, bądź kropka do dwóch liczb po przecinku, dodam też, że jest to wzór przysłany z placówki państwowej, to też powinno być dobrze, więc obstawiam, że mój błąd... o co może chodzić?

PS jeśli podczas walidacji wyskakuje mi komunikat, o błędzie bo pole jest puste, bo nie musi być wypełnione, ale bład wyskakyje, to czy moge zrobić tak, aby tylko wyskoczył komunikat o tym, ale niech plik się wygeneruje?

Warning: DOMDocument::schemaValidate(): Element 'nrReg': [facet 'pattern'] The value '' is not accepted by the pattern '.{9}'
Warning: DOMDocument::schemaValidate(): Element 'nrReg': '' is not a valid value of the local atomic type. in...bla bla.. on line 676
np:
  1. if (!$xml->schemaValidate('./schemaxml.xsd')) {
  2. if(Warning[poleX] == '') { echo 'puste pole X'; }
  3. } else { ok }

Przepraszam za ten dziwny if, ale nie wiem pod jakim slowem kluczem mam czegoś takiego szukać w google wink.gif
Z góry dziękuję
SmokAnalog
Taki wzorzec:
Kod
\d{0,12}(,{1}\d{2})?


Oznacza dokładnie od 0 do 12 cyfr, po których może (ale nie musi) wystąpić przecinek i dwie cyfry. Nie wiem dlaczego ktoś podkreślił występowanie przecinka w liczbie {1}, to bez sensu. Dziwne też to, że wg takiego wzorca poprawna jest np. wartość ",38". Poprawna będzie też pusta wartość "".
Pyton_000
Ten pattern oznacza ze ma być:
- dokładnie od 0 do 12 cyfr
- dokładnie 1 przecinek
- dokładnie 2 cyfry

czyli poprawne jest:
Kod
,02
1,00


Nie poprawne
Kod
1122222222222,
00,0
22,,00
222
adek-
SmokAnalog faktycznie, gdy do liczby 110544,2 dodam 0 na końcu 110544,20, bądź jakąkolwiek inną liczbe to działa. Również działa to co opisujesz, czyli ",00" same "0" bądź puste pole. Co najlepsze to generowałem plik z formularza na stronie tej placówki i xml wygenerowany wyrzuca dokładnie taką samą liczbę 110544,2 i im to przechodzi bez błędu... a walidacji wg. schema.xsd od nich nie... burdel na kółkach? biggrin.gif

A jak moge jeszcze obsłużyć te warningi, aby wyrzuciło echo, że dane pole jest puste i wygenerowało plik czy tak czy siak, ale żeby dało info o tym?
  1. if (!$xml->schemaValidate('./schemaxml.xsd')) {
  2. if(Warning[poleX] == '') { echo 'puste pole X'; }
  3. } else { ok }

Jest jakiś warnek na to, albo pod czym mam wyguglować?
by_ikar
Tutaj masz do czego ci się dopasowuje twoje wyrażenie: http://www.regexr.com/397ue - skrypt słusznie zwraca nie to co oczekujesz, bo wyrażenie jest niepoprawne.


Cytat(SmokAnalog @ 29.07.2014, 15:03:25 ) *
Dziwne też to, że wg takiego wzorca poprawna jest np. wartość ",38". Poprawna będzie też pusta wartość "".


dzieje się tak ponieważ zostało użyte {0,12}, zamiast {1,12} (zakres od 1 do 12 cyfr, a nie jak w pierwszym poście od "niczego" do 12 cyfr). Więc poprawniej wyglądało by to tak:

Kod
\d{1,12}(,\d{1,2})?


http://www.regexr.com/397uh
SmokAnalog
Pyton, wprowadzasz kolegę w błąd.
adek-
by_ikar - super stronka! Dziękuję Ci również za pokazanie poprawnego wpisu, faktycznie teraz waliduje tak jak być powinno! biggrin.gif
podpowiedzcie jeszcze proszę z tymi warningami i jestem super wdzięczny.

edytowane ====
ewentualnie wpadłem na inny pomysł... zmienię walidację w xsd żeby przyjmowało puste pole wink.gif

Czy będzie poprawnym gdy z ".{11}" przerobię na ".{11}|{^$}" ... Czyli będzie to koniecznie 11 jakichkolwiek znaków (nie 10 i nie 13 tylko równe 11) , lub puste pole, tak? smile.gif
SmokAnalog
A może tak:
Kod
(\d+(,\d+)?)?
adek-
Cytat(SmokAnalog @ 29.07.2014, 15:31:09 ) *
A może tak:
Kod
(\d+(,\d+)?)?

ale to wyrażenie wpuszcza mi nawet gdy cyfra jest wielkości 1 znaku, bądź nawet 15, ale musi to być cyfra, gdy litera błąd. A bardziej chodziło mi o to że albo 11 cyfr, albo nic, puste pole wink.gif
  1. .{11}|\s

tutaj też trochę nie tak, bo \s to biały znak i przechodzi gdy jest tam liczba 11 cyfrowa, lub spacja ;/ Jak okreslić puste pole, bądź brak danych?
by_ikar
Niestety nie jestem w stanie ci pokazać na przykładzie tamtej stronki czy ów wyrażenie złapie brak znaków, dlatego pokażę ci przykład w php:

  1. <?php
  2.  
  3. $pattern = '#^$|\d{1,12}(,|\.\d{1,2})?#';
  4.  
  5. var_dump(preg_match($pattern, '110544,2'), preg_match($pattern, ''));


wynik będzie taki:

Kod
int 1
int 1


samo wyrażenie wygląda tak:

Kod
^$|\d{1,12}(,|\.\d{1,2})?


Dodałem dodatkowo możliwość kropki, bo doczytałem twój pierwszy post tym razem do końca.
Pyton_000
Smoku wybacz, dopiero teraz zauważyłem ? na końcu patternu ;/
Pogoda juz mnie chyba dobija, 33' w cieniu
adek-
Dziękuję by_ikar, ale powiedz mi jeszcze jak zrobić by wartość 11 byle jakich znaków
  1. .{11}

ustawić tak, żeby też przyjmowało 11 znaków bądź puste pole, jedno z dwóch? Bo w tej wersji musi być 11 znaków i nie dopuszcza pola pustego.
  1. .{11}|\s

\s nie jest rozwiązaniem, bo musiałby tam być znak spacji. Natomiast wyrażenie
  1. ^$|.{11}

nie spełnia się, bo gdy nawet dam sam znak ^$ to gdy mam puste pole to i tak krzyczy że jest źle.
Jakie jest wyrażenie zezwalające na puste pole, bo nie mogę znaleźć tego w google? Chyba, że puste pole nie jest wyrażeniem żadnym biggrin.gif
Kloc
spróbuj tak

  1. .{11}|[^.]
SmokAnalog
Ale wy kombinujecie biggrin.gif Przecież prościej tak:
Kod
(.{11})?
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.