Autor Zpráva
okolojdouci
Profil *
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
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 *
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
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);
Ale moc se mi to nelíbí - nemůžete nějak ovlivnit ten vstup, aby se použil jiný oddělovač a/nebo byly všechny hodnoty vždy uzavřené mezi nějakými znaky, např. apostrofy? Pak byste totiž mohl využít funkci str_getcsv.
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
Nebo použij:
    $handle = fopen($soubor, "r");
    while (($data = fgetcsv($handle, 32000, ";")) !== false) {
          //...
    } 
okolojdouci
Profil *
tatyalien:
Funguje bez chyby, MNOHODÍK!!

Tori:
Taky díky, ale upřednostním nativní php funkci. Zkusil jsem a opravdu funguje :-)
tatyalien
Profil
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 ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0