Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML][PHP]Czy dobrze rozumiem to wyrażenie regularne?, przy validacji xml
adek-
post 29.07.2014, 12:57:46
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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ę

Ten post edytował adek- 29.07.2014, 13:16:15
Go to the top of the page
+Quote Post
SmokAnalog
post 29.07.2014, 14:03:25
Post #2





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

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


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ść "".
Go to the top of the page
+Quote Post
Pyton_000
post 29.07.2014, 14:42:40
Post #3





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

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


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
Go to the top of the page
+Quote Post
adek-
post 29.07.2014, 14:46:23
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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ć?
Go to the top of the page
+Quote Post
by_ikar
post 29.07.2014, 14:51:49
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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
Go to the top of the page
+Quote Post
SmokAnalog
post 29.07.2014, 15:05:54
Post #6





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

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


Pyton, wprowadzasz kolegę w błąd.
Go to the top of the page
+Quote Post
adek-
post 29.07.2014, 15:06:01
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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

Ten post edytował adek- 29.07.2014, 15:24:10
Go to the top of the page
+Quote Post
SmokAnalog
post 29.07.2014, 15:31:09
Post #8





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

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


A może tak:
Kod
(\d+(,\d+)?)?
Go to the top of the page
+Quote Post
adek-
post 29.07.2014, 15:43:05
Post #9





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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?

Ten post edytował adek- 29.07.2014, 16:00:10
Go to the top of the page
+Quote Post
by_ikar
post 29.07.2014, 16:16:17
Post #10





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post 29.07.2014, 17:43:21
Post #11





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

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


Smoku wybacz, dopiero teraz zauważyłem ? na końcu patternu ;/
Pogoda juz mnie chyba dobija, 33' w cieniu
Go to the top of the page
+Quote Post
adek-
post 30.07.2014, 14:45:21
Post #12





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

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


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

Ten post edytował adek- 30.07.2014, 14:46:42
Go to the top of the page
+Quote Post
Kloc
post 30.07.2014, 15:30:24
Post #13





Grupa: Zarejestrowani
Postów: 115
Pomógł: 8
Dołączył: 8.06.2014

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


spróbuj tak

  1. .{11}|[^.]


--------------------
Kloc = Kolor
Obama !== Murzyn
Obama === Kloc


Jak Ci pomogłem to daj Pomógł, tu nie chodzi o te Pomógł, bo to do niczego nie potrzebne, ale daj! :D
Go to the top of the page
+Quote Post
SmokAnalog
post 30.07.2014, 15:35:36
Post #14





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

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


Ale wy kombinujecie biggrin.gif Przecież prościej tak:
Kod
(.{11})?
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 2.05.2025 - 06:11