Autor Zpráva
Šéva
Profil
Dobrý den,

tak nějak úplně neholduji regulárním výrazům a předpokládám, že můj problém se dá vyřešit asi nejlépe jimy. Mám string a v něm tabulku se sloupci a řádky. V některých buňkách se bude objevovat i cena. Ta se pozná buď podle "Kč" nebo podle ",-". V jednom výstupu bych tu cenu potřeboval z textu odstranit.

Poradil by mi prosím někdo, kdo ovláda ty výrazy, jak udělat podmínku na odstranění ceny z buňky?
Ještě mne napadla taková věc, že bych té buňce dal classu a pak bych jí pomocí CSS skrýval v tom daném výstupu, ale odstranění přímo z textu mi příjde lepší řešení.

Děkuji
Taps
Profil
Šéva:
na danou problematiku je možné využít i funkci
<?
 str_replace();
 ?
Šéva
Profil
Tu znám, ale ta mi nahradí pouze určitý string určitým. Ale já nebudu vědět ty ceny. Kč nebo ,- jsou pouze znaky, kterých se dá chytnout a tím se zjistí, že před tím je i cena. Ale už nevím, kolika ciferná a případně, co když tam bude mezera nebo i víc jak jedna mezera?
juriad
Profil
Šéva:
preg_replace:
/\d[\d\s]*(Kč|,-)/
číslice následnovaná číslicí nebo mezerou libovolně krát a na konci je buď Kč nebo ,-.
Ještě můžeš chtít ze začátku či konce odstranit mezeru
Karel N.
Profil
Takhle stačí?
<?php

$products = Array(
"Test 10 Kč",
"Loď 100,-.",
"Cesta na Mars 10Kč"
);

function trimPrice($text) {
    return preg_replace("/(\s?\d+\s?Kč|,-)/i", "", $text);
}

a výsledek
array(3) {
  [0]=>
  string(4) "Test"
  [1]=>
  string(9) "Loď 100."
  [2]=>
  string(13) "Cesta na Mars"
}

Taps: To nejde takhle použít, musel bys znát všechny konkrétní hodnoty cen, ktere se v textu vyskytují.


juriad: to není nejlepší řešení, odmaže to i číslo, které následuje před cenou, např. Test 1 10 Kč a zanechává mezeru na konci textu po odstranění ceny.
juriad
Profil
Karel N.:
To ti nefunguje, nebo (vertical bar) má menší prioritu, a je to vidět na tvém druhém příkladu. Musíš to lépe sgrupovat.
Ale kombinací našich odpovědí se Šéva snad dobere k cíli.


Na druhou stranu, české formátování čísel předpokládá mezery před tisíci.
Co například: Test 1 100 Kč a jsme nahraní oba dva. :-)
A co když text začíná cenou a pokračuje textem, ty tam tu mezeru necháváš.
100 Kč guláš

Samozřejmě, že to lze naprogramovat, ale už se spíš dostáváme do situace, kdy regex má najít cenu a její kontext a pomocí callbacku se vlastně zjistí, co se má provést. Často totiž poblíž ceny bude nějaký oddělovač, například předložka za, pomlčka nebo dvojtečka.
Karel N.
Profil
děkuji, samozřejmě máš pravdu :). Myslím, že necháme Ševu si to doplnit samotného.

Ano, odstranění ceny není snadné, už několikrát jsme se s tím složitě potýkali a vždy to byl kompromis a vlastní gramatika. To ještě nepočítáme s desetinnými místy.

Chyba u oddělovač tisíců se dá minimalizovat, pokud si zkontrolujeme, jestli před první číslicí je bilý znak nebo písmeno. Cena na začátku věty přináší ještě problém, že musíme udělat první velké písmeno.

Šévo, můžeš použít naše řešení, ale musíš výsledek ručně zkontrolovat a případné chyby ručně zkorigovat.
Šéva
Profil
Karel N., juriad:
Moc Vám oběma děkuji. Od začátku mi bylo jasné, že to nebude jednoduché a že to bude muset mít určitá pravidla, ty ceny, aby se to dalo nějak rozumně odstranit. Bude se jednat jen o maximálně stovkové částky, takže mezera před tisícem nebude.

Ještě jednou děkuji a už si to případně nějak doupravím.

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: