Autor | Zpráva | ||
---|---|---|---|
okolojdouci Profil * |
#1 · Zasláno: 5. 10. 2011, 20:53:49
Potřeboval bych explodovat textový sobor podle středníků. Je to trošinku komplikované tím, že nechci explodovat středníky uvnitř řetězců, vymezených uvozovkami, a to i vnořenými. Takže potřebuju "něco jako explode středníkem", přičemž se nebude explodovat tímto:
"ahoj";"jedna;dva";"ahoj";"je"dn"a;dva" Přesná definice těch ignorovaných středníků je: středník nacházející se za lichým počtem uvozovek, počítáno od minulého platného středníku nebo od začátku celého řetězce. Smiřuji se s tím, že budu muset použít tupou sílu, procházet to po jednotlivých střednících a uvozovkách. Ty "nefunkční" středníky nahradím nějakým dočasným řetězcem, pak exploduju a v tom výsledném poli nahradím zpět. Jestli máte někdo lepší nápad, budu rád, dík. |
||
janbarasek Profil |
#2 · Zasláno: 5. 10. 2011, 21:17:35 · Upravil/a: janbarasek
okolojdouci:
Pokud to bude přesně řetězec: "ahoj";"jedna;dva";"ahoj";"je"dn"a;dva" tak bych navrhoval tento kód: <?php $a = '"ahoj";"jedna;dva";"ahoj";"je"dn"a;dva"'; $b = explode('";"', $a); echo $b[0]; ?> Funguje to na použití uvozovek a apostrofů. Že když je u středníku uvozovka, tak to exploduje, když není, tal se nic neděje. Ještě nějak musíš pořešit začátek a konec řetezce. Tady ti popisuji princip, jak na to. |
||
okolojdouci Profil * |
#3 · Zasláno: 5. 10. 2011, 21:29:23
janbarasek:
Rozumím, ale tohle nepůjde. Středníky nejsou vždy obklopeny uvozovkami. Běžně se tam vyskytuje třeba toto: 141;;sds"sdfffs";errr V tomto případě mají být všechny středníky funkční. |
||
Tori Profil |
#4 · Zasláno: 5. 10. 2011, 22:49:51 · Upravil/a: Tori
okolojdouci:
Šlo by to z opačné strany - místo hledání oddělovače hledat hodnoty: $a = '"ahoj";"jedna;dva";"ahoj";"je"dn"a;dva"'; $b = '141;;sds"sd;fffs";erddr'; $re = '~([^;"]*?(?:"[^"]+"[^;]*)*)(?:;|$)~U'; preg_match_all($re, $a, $m1, PREG_SET_ORDER); preg_match_all($re, $b, $m2, PREG_SET_ORDER); echo '<pre>'; var_dump($m1); echo '<hr>'; var_dump($m2); Ten regulár je první funkční verze, takže vyžaduje, aby všechny uvozovky byly správně uzavřené, a přidává na konec prázdný prvek. Určitě by šel napsat líp, to jen tak pro inspiraci. |
||
tatyalien Profil |
#5 · Zasláno: 6. 10. 2011, 08:39:27
Nebo použij:
$handle = fopen($soubor, "r"); while (($data = fgetcsv($handle, 32000, ";")) !== false) { //... } |
||
okolojdouci Profil * |
#6 · Zasláno: 6. 10. 2011, 16:40:23
tatyalien:
Funguje bez chyby, MNOHODÍK!! Tori: Taky díky, ale upřednostním nativní php funkci. Zkusil jsem a opravdu funguje :-) |
||
tatyalien Profil |
#7 · Zasláno: 7. 10. 2011, 21:58:44 · Upravil/a: tatyalien
okolojdouci:
Občas mě to někdy blblo. Od jednoho dodavatele (generuje sice txt soubor v utf-8, středníky, čárky atd...). Několik chyb jsem si pak ošetřil, ale 99% je v poho ;) |
||
Časová prodleva: 13 let
|
0