Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyrażenia regularne
Forum PHP.pl > Forum > PHP
Ruio
Hmm z wyrażeniami regularnymi chyba każdy miał kiedyś jakiś problem wiec przyszła kolej i na mnie ;/
Do rzeczy smile.gif

Mam string przygotowany przez pewien program do użycia i przerobienia pod tablice. Np:
  1. "253","bubqfwwfqqwfo","qwfqfwqfwfw","","fqwfwqfwfwqfw@yahoo.com"
  2. "254","sdggssggdsgd","sdggsdgsdsgd","","gsdsdgsgdgsd@yahoo.com"

W tym wypadku nie ma problemu. Wszystko działa bez problemu. Użyłem czegoś takiego jako wyrażenia regularnego:
  1. '/"(.*)"/U'


Problem zaczyna się gdy w jednej z komórek znajduje się cudzysłów. Wtedy wyrażenie regularne po prostu nie działa prawidłowo smile.gif
Np:
  1. "253","bubqfwwfqqwfo","qwfqf"wqf"wfw","","fqwfwqfwfwqfw@yahoo.com"
  2. "254","sdggssggdsgd","sdggsdgsdsgd","","gsdsdgsgdgsd@yahoo.com"


Jeśli ktoś ma pomysł jak to rozwiązać będę naprawdę wdzięczny.
Pozdrawiam
nospor
Przecież tu nie jest potrzebne wyrażenie regularne.... wystarczy explode po przecinku i po sprawie
Ruio
Chciałem tak zrobić jednak na końcu każdej linii nie ma przecinka co powoduje pewne problemy... (to nie mój błąd, ze go nie dodałem wink.gif)
nospor
No ale rozbij wpierw wszystko po liniach a dopiero potem kazdą linie po kolei po przecinku.
Ruio
Tylko pytanie jak to rozbić "po liniach"?
Nie mam pomysłu szczerze mówiąc ;/

Kazda z "komórek z danymi" możne zawierać wszelakie znaki typu spacje, pauzy, cudzysłowy itd wiec nie mogę za bardzo polegać na czymś typu: explode(' ', $string)
Crozin
Znaki specjalne (tutaj właściwie tylko sam cudzysłów i ewentualny znak ucieczki (najczęściej \)) w tekście nie są w żaden sposób escape'owane? Nie ma przed nimi ukośnika czy czegoś w tym rodzaju? Bo w tej chwili, jeżeli w tekście pojawi Ci się ciąg: ", to nie za bardzo da się go odróżnić od separatora kolejnych komórek.
lukasz_os
robisz tak:

  1. explode("\n",$string);
  2. //a potem dla kazdej linii
  3. explode(",",$string);
Ruio
Jeśli pojawi się cudzysłów to jest podwajany. Zrobiłem drobny błąd w przykladze, czyli powinno być:
  1. "253","bubqfwwfqqwfo","qwfqf""wqf""wfw","","fqwfwqfwfwqfw@yahoo.com"
  2. "254","sdggssggdsgd","sdggsdgsdsgd","","gsdsdgsgdgsd@yahoo.com"


Co do pojawienia przecinka to nie jest w żaden sposób escapowany...

Wydaje mi się ze bez wyrażenia regularnego chyba się nie obejdzie bo raczej nie mogę użyć (explode(",",$string)wink.gif z powodu opisanego wyżej...
Crozin
To wygląda w takim razie jak prawie "standardowy"* plik CSV. fgetcsv powinno dać radę.

* niestety format CSV nie jest ustandaryzowany i wariant z podwójnym cudzysłowem zamiast znaku ucieczki (\) nie należy do najpopularniejszych.
Ruio
Wielkie dzięki Crozin. Teraz powinno mi się udać jakoś to ogarnąć wink.gif
by_ikar
Z wyrażeniem też można by spróbować, aczkolwiek do ideału mu daleko, zważywszy na sytuacje że wewnątrz cudzysłowia pojawić się również może przecinek, spacja, czy inne białe znaki.. Na szybkiego coś takiego wykminiłem:


  1. <?php
  2.  
  3.  
  4. $str = '"253","bubqfwwfqqwfo","qwfqf""wqf""wfw","","fqwfwqfwfwqfw@yahoo.com","254","sdggssggdsgd","sdggsdgsdsgd","","gsdsdgsgdgsd@yahoo.com"';
  5.  
  6. preg_match_all('/(")?([\w\d"@\.]+)(?(1)")/', $str, $matches);
  7.  
  8. echo '<pre>'.print_r($matches, true).'</pre>';


Jeżeli rozbijać, to albo 2x explode, albo preg_split. Niestety wyrażenia słabo sobie poradzą z takimi danymi, bo nie bardzo jest się czego złapać. Do tych co podałeś to jeszcze można napisać wyrażenie, co tez uczyniłem, ale gdyby tylko pojawiły się wewnątrz spacje, czy przecinki, już takie wyrażenie jest kimpletnie nieprzydatne.. Gdyby fgetcsv podany przez @Crozin miał jakieś bóle, a dane które otrzymasz będziesz pewien że nie będą zawierać przecinka, czy białego znaku, to śmiało możesz pobawić się wyrażeniem podanym wyżej, w przeciwnym wypadku odradzam. wink.gif

EDIT: jednak nie, wyrażeniem też da się to pocisnąć:

  1. <?php
  2.  
  3.  
  4. $str = '"253","bubqfwwfqqwfo","qwfqf""wqf""wfw","","fqwfwqfwfwqfw@yahoo.com","254","sdggssggdsgd","sdggsdgsdsgd","","gsdsdgsgdgsd@yahoo.com"';
  5.  
  6. preg_match_all('/(?:,|^)([^",]+|"(?:[^"]|"")*")?/', $str, $matches);
  7.  
  8. echo '<pre>'.print_r($matches, true).'</pre>';


A ten CVS to jest chyba przez excela zapisywany?
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.