Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyrażenia regularne - ustawianie separatorów
Forum PHP.pl > Forum > Przedszkole
kristaps
Witam, mam pewien problem. Staram się na podstawie formatowania tekstu nadać odpowiednio separatory. Mam takie wyrażenie regularne:

  1. $line = preg_replace('/([0-9]+)\s+([0-9]+)\s+(.+?)\s+([a-z0-9\-\*]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([a-z]+)/si','$1 $2;$3;$4;$5;$6;$7;$8;$9;',$line);


Kod
217 672    HAM.SZCZEKI OCTAVIA 1.6-1.9TDI 96-          AH-1060                 1     23    34,36       42,26         PLN


W powyższym przykładzie jest wszystko ok, ponieważ symbol towaru tj. AH-1060 nie zawiera spacji, więc separatory zostały odpowiednio przydzielone. Natomiast niżej jest odwrotna sytuacja.

Kod
220 374    HAM.SZCZEKI FIESTA 90- /180X32/             220 374                 1     23    25,12        30,9         PLN


W tym przypadku dzieli mi fakturę w ten sposób:

Kod
220 374;HAM.SZCZEKI FIESTA 90- /180X32/             220;374;1;23;25,12;30,9;PLN;


Usunąłem zakres wyrażania i spróbowałem skorzystać z grupy wzorców, tak samo jak rozwiązane jest to w przypadku nazwy towaru (.+?), jednak pewnie o czymś zapominam, bo całość się sypie.
Nie wiem czy jasno opisuję problem, dlatego na koniec napiszę, że zależy mi na takich separatorach: symbol;nazwa;symbol;ilosc;vat;netto;brutto;pln;

Wyrażenie regularne dla 3 kolumny jest błędne.

Z góry dziękuję za pomoc.
Sinevar
A jak zmienisz na to poniżej? (dodałem tam \s)
  1. $line = preg_replace('/([0-9]+)\s+([0-9]+)\s+(.+?)\s+([a-z0-9\-\*\s]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([a-z]+)/si','$1 $2;$3;$4;$5;$6;$7;$8;$9;',$line);
kristaps
Tak, wcześniej próbowałem, niestety otrzymuję taki wynik:

505 240;SWIECA ISKROWA V-LINE NR 13 OPEL V-LINE/13;BPR6ES-11 ;4;23;5,76;7,08;PLN;

zamiast:

505 240;SWIECA ISKROWA V-LINE NR 13 OPEL; V-LINE/13 BPR6ES-11 ;4;23;5,76;7,08;PLN;
Sinevar
Czyli chodziłoby o to, by w tym subregexpie ([a-z0-9\-\*]+) brał pod uwagę tylko spacje w środku, a zlewał te dookoła?
kristaps
Załóżmy, że mam taki przykład:


Kod
505 225    SWIECA ISKROWA V-LINE NR 5 DB               V-LINE/5 BP6EF          4     23    4,66        5,73         PLN



505 225;SWIECA ISKROWA V-LINE NR 5 DB;V-LINE/5 BP6EF;4;23;4,66;5,73 ;PLN

Ostatnich nie wyróżniłem. Zależy mi by 2 i 3 grupa niezależnie od ilości spacji dzieliła się jak powyżej.
Sinevar
A co powiesz na to? smile.gif

  1. $line = preg_replace('/([0-9]+)\s+([0-9]+)\s+((?:(?:[a-z0-9\-\/\.]+\s?)*)[^\s$])\s+((?:(?:[a-z0-9\-\/\.]+\s?)*)[^\s$])\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([a-z]+)/si','$1 $2;$3;$4;$5;$6;$7;$8;$9;',$line);
kristaps
Niestety, nadal się sypie. (Sporadyczne przypadki:)

429 779;PRZEGUB ZEWN.ASTRA F 1.4-1.6;/Z OSLONA 844021*;1;23;42,99;52,88;PLN;
418 474;PRZEGUB WEWN.AUDI 80 72-86;/Z OSLONA/ 603005;1;23;46,64;57,37;PLN;
418 349;PRZEGUB ZEWN.TICO 90-95;/Z OSLONA/ 812006;1;23;33,09;40,7;PLN;


No ale już blisko smile.gif
Sinevar
To przeklej te wszystkie przypadki, które się sypią. Tylko fajnie jakbyś to przekleił w tych blokach code, cobym miał dokładny pogląd na każdą linijkę.
kristaps
Kod
700 998    USZCZELN.MIARKI OLEJU VW 1.5-1.8/PLASTIK    053 103 663             1     23    0,48        0,59         PLN


700 998;USZCZELN.MIARKI OLEJU VW 1.5-1.8/PLASTIK 053 103;663;1;23;0,48;0,59;PLN;

Kod
406 149    OSLONA PRZEGUBU ZEWN.KOMP.AUDI A4 TP 94-            406 149                 1     23    15,44   18,99         PLN    
406 179    OSLONA PRZEGUBU ZEWN.KOMP.CINQUECENTO 91    406 179                 1     23    8,76       10,77         PLN
400 260    OSLONA PRZEGUBU ZEWN.KOMP.KADETT/KARTONI    400 260                 1     23    6,38        7,85         PLN    
400 259    OSLONA PRZEGUBU ZEWN.KOMP.GOLF/KARTONIK/    400 259                 1     23    6,69        8,23         PLN    
401 352    OSLONA PRZEGUBU ZEWN.KOMP.BRAVA/O 1.6 TP    401 352                 1     23    15,4       18,94         PLN    
504 097    SYGNAL DZWIEKOWY VW,SEAT,SKODA/510HZ/       191 951 223             1     23    16,54       20,34         PLN    
304 775    SRUBA DO KOL POLO,PASSAT /M12X1.5X23.5/     3A0 601 139             4     23    2,9        3,57         PLN    
418 099    SRUBA DO KOL C3/M12X1,25/KL19/FELGA STAL    21175                   4     23    2,2        2,71         PLN    
111 987    KOREK PALIWA ASTRA,OMEGA,VECTRA/ZAM.CENT    08 08 117               1     23    6,38        7,85         PLN    
503 761    WKLAD ELEKTR.STACYJKI AUDI 80,100,A4,A6     4A0 905 849B            1     23    15,62       19,21         PLN    
100 762    KOREK PALIWA AUDI,SEAT,VW /ZAMEK CENTR./    1H0 201 553B            1     23    5,06        6,22         PLN    
026 135    KORKI SPUSTU OLEJU+PODK./60 SZT//TABLICA    574.581.001             1     23    219,65      270,17         PLN    
125 117    CIEGNO DRZWI GOLF,VENTO 91-97               1H0 837 223             1     23    1,45        1,78         PLN


a dla tych w większości przypadków nie przyznało separatorów:

Kod
111 987    KOREK PALIWA ASTRA,OMEGA,VECTRA/ZAM.CENT    08 08 117               1     23    6,38        7,85         PLN
Sinevar
Teraz wyłapuje i te powyższe przypadki.

  1. $line = preg_replace('/([0-9]+)\s+([0-9]+)\s+((?:(?:[a-z0-9\-\/\.\,\+]+\s?)*)[^\s$])\s+((?:(?:[a-z0-9\-\/\.\,\+]+\s?)*)[^\s$])\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([0-9,]+)\s+([a-z]+)/si','$1 $2;$3;$4;$5;$6;$7;$8;$9;',$line);


Sprawa wygląda tak: gdyby się znów znalazł jakiś specjalny znak, którego nie ma w tych klamrowych nawiasach [a-z0-9\-\/\.\,\+], to po prostu go tam dodajesz. Tym razem brakowało przecinka i plusa, toteż dodałem \, \+ w dwóch miejscach i zaczęło działać.

kristaps
Witam, dziękuję bardzo za pomoc. A co w tym przypadku:

Kod
500 930    PRZEKAZNIK POMPY PALIWA POLO,GOLF,PASSAT           191 906 383C            1     23    6,47        7,96         PLN



500 930;PRZEKAZNIK POMPY PALIWA POLO,GOLF,PASSAT 191 906;383C;1;23;6,47;7,96;PLN;

Wyrażenie regularne uwzględnia przecinki.

Kod
701 858    ORING /19.6 3.65/ BLOKU SILNIKA VW /GUMA    N   903 168 02          1     23    0,4        0,49         PLN


701 858;ORING /19.6 3.65/ BLOKU SILNIKA VW /GUMA N;903 168 02;1;23;0,4;0,49;PLN;

Kod
401 465    SRUBA DO KOL GOLF,PASSAT,AUDI M14X1.5X27      8D0 601 139D            4     23    5,9        7,26         PLN


401 465;SRUBA DO KOL GOLF,PASSAT,AUDI M14X1.5X27 8D0 601;139D;4;23;5,9;7,26;PLN;
223 485;ZESTAW INSTAL.SZCZEK HAM.VW,AUDI /200X40 223;485;1;23;10,38;12,77;PLN;

Myślałem, że w niektórych przypadkach może być ważna wielkość liter, dlatego dodałem: a-zA-Z0-9, a nie a-z0-9, no ale nie pomogło.

Z góry dziękuję za pomoc.
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.