Autor Zpráva
MichalekII
Profil
zdravím,
potřebuji ošetřit textový vstup aplikace. Pokud uživatel při psaní textu nevloží za čárku (tečku, středník) mezeru, tak chci aby aplikace sama ošetřila.

Hledám, zkouším co se dá, ale asi na to prostě nemám, prosím tedy zdejší zkušenější o radu.
donny
Profil
<?php
function checkString($value)
{
  //pole znakov za ktore bude dosadzovat medzeru, dajú sa doplniť aj iné znaky..
  $stringArray = array(",", ";");
  //rozdelenie retazca do pola po jednotlivych pismenach
  $dataArray = str_split($value);
  //spocitanie, da sa urobit aj priamo vo cykle ak chcem usetrit riadok a minimum pamate
  $numberInArray = count($dataArray);
  //cyklus ktory prebehne cele pole vytvorene z retazcka
  for($a = 0; $a < $numberInArray; $a++)
  {
     //ak je znak v poli
     if (in_array($dataArray[$a], $stringArray)) 
     {
        //index dalsieho znaku je ?
        $index = $a + 1;
        /* otestuj ci dalsi znak je medzera, teoreticky to ani testovať nemusím, html aj tak striktne 
        nezobrazuje 2 medzery vedla seba ale pre spravnost */
        if($dataArray[$index] !=' ')
        {
          //ak nie je dopln medzeru
          $dataArray[$a] .= " ";
        } 
     }
  }
  //spoj to spat dokopy a posli to ako navratovu hodnotu
  return implode("", $dataArray);
}

//spustenie funkcie, prípadne to nemusi byt ani funkcia
$value = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr,sed diam nonumy eirmod; tempor invidunt, ut labore et dolore magna aliquyam erat,sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";
echo checkString($value);
?>



poznámka.. dalo by sa to aj cez cyklus a strpos ale takto mi to prišlo jednoduchšie, rád sa hrám s textami a poliami :)
MichalekII
Profil
Díky za funkci, podobné konstrukce jsem také vymýšlel, tak trochu jsem doufal v kód na dva řádky s využitím preg_replace()
donny
Profil
No vídíš tak ja som zas tak trochu dúfal že sa ti moja 8 riadková funkcia bude páčiť viac, keďže som ti tu postol hotové, funkčné a variabilné riešenie..

Ale kľudne si to skús s preg_replace, začni niekde pri tomto..
<?
  $result = preg_replace(/[,;]/, ', ', $string); 
?>
Tori
Profil
např. $opravenyText = preg_replace('~(?<=[.,;])\h*(?=\S)~', ' ', $text);Pokud za interpunkcí následuje víc mezer, nechá jen jednu. Do hranatých závorek si doplňte další znaky, za kterými se mají mezery doplňovat / opravovat (některé znaky je potřeba escapovat, koukněte se do manuálu).
MichalekII
Profil
donny:
Dony, já si vážím každé rady a pomoci a ano a její varibialita je super, já to původně řešil pomocí funkce explode kde jsem si řetězec rozdělil podle čárek, ošetřil konce a znova složil ...

Tori:
To je super, kdyby jsi se pro nás zabedněné pokusil ten reg. výraz vysvětlit tak by jsi byl za hvězdu (alespoň u mě)

A dal by se ten příkaz ještě vylepšit o to, že pokud by byla mezera před tou interpunkcí tak by byla odstraněna?
Camo
Profil
A prečo nepoužiješ fciu. strtr() a máš to na jeden riadok a bez regulárnych výrazov.
Tori
Profil
MichalekII:
Ráda. ;-) To znamená "pokud najdeš mezery a/nebo tabulátory v počtu nula nebo více - \h*, před nimiž je tečka, čárka nebo středník - (?<=[.,;]) a za nimi následuje znak, který není bílý - (?=\S), nahraď je jednou mezerou." Bílé znaky: \h znamená horizontální bílé místo (mezera, \t), \v je vertikální (\r, \n), \s znamená obojí.
S opravou mezer i před čárkou třeba takhle: $opravenyText = preg_replace('~(?<=^|\S)(?:\h*)([.,;]+)\h*(?=\S|$)~', '\\1 ', $text);Akorát na konci po tečce zůstává mezera.

strtr je na jednu stranu jednodušší, na druhou stranu neumí udělat podmíněné nahrazení (za čárky přidej mezery jen tam, kde chybí).
user243
Profil
Tori:
a zkusit to nějak takto?
$retezec = "jablko,meloun,kiwi;mrkev, brambora, česnek.";
$nahradit =  array(", " => ", ", "; " => "; ", ". " => ". ", "," => ", ", ";" => "; ", "." =>". ");
$retezec = strtr($retezec, $nahradit);
a aby nebyla mezera na konci, tak by šlo udělat while na test posledního znaku řetězce;
Tori
Profil
user243:
Koncová mezera se dá vyhodit pomocí rtrim.
a zkusit to nějak takto?“ - na tohle nebude fungovat, ani na deset mezer za čárkou. Nevnucuji použití preg_replace, sama radši použiju řetězcové funkce, pokud to jde, ale některé věci se bez regulárů dělají dost nešikovně.
Camo
Profil
$a1=array(',',';','  ');
$a2=array(', ','; ',' ');
str_replace($x,$a1,$a2);
donny
Profil
user243:
$retezec = "jablko,meloun,kiwi;mrkev, brambora, česnek.";
$nahradit = array(", " => ", ", "; " => "; ", ". " => ". ", "," => ", ", ";" => "; ", "." =>". ");
$retezec = strtr($retezec, $nahradit);



Camo:

$a1=array(',',';',' ');
$a2=array(', ','; ',' ');
str_replace($x,$a1,$a2);


Nechcem sa v tom moc rýpať ale toto na jeden riadok rozhodne nevyzerá (ak by som to ešte mal overovať whilom), pripadá mi to ako keby ste za každú cenu chceli niečo (niekomu) dokázať. Neviem ale načo to je dobré keďže už tazateľ má 2 funčné riešenia s ktorých si vybral
Camo
Profil
donny:
Ak dáš, tie polia priamo do funkcie tak je to na jeden riadok...
Ale problém je inde. Nechal som sa oklamať výstupom v prehliadači, ktorý nadbytočné medzery ignoruje a navyše tam mám prehodené poradie... :D
Hanba fuj!
donny
Profil
ok tak v takom prípade keď to vyhodím s funkcie a trochu to vyposúvam tak aj to moje riešenie bude mať 1 riadok :D
MichalekII
Profil
Tori:
Ještě jednou velké díky ... funguje to přesně podle mích představ

-----
Pánové ruku na srdce, řešení Tori je přinejmenším elegantní všechna ostaní řešení jsou na můj případ myslím dosti kostrbatá:

Mám text: Ovoce a zelenina jsou jablko,meloun,kiwi;mrkev, brambora , česnek.
A chci dostat: Ovoce a zelenina jsou jablko, meloun, kiwi; mrkev, brambora, česnek.
Camo
Profil
No jasné, hlavne že tomu rozumieš...
1Pupik1989
Profil
Aha, tak koukám vyřešeno. No, tak jsem tu funkci také hodím.
$result = trim(preg_replace("~\s*([;,.])\s*~","\\1 ",$string));
Kajman
Profil
MichalekII:
Pokud uživatel při psaní textu nevloží za čárku (tečku, středník) mezeru, tak chci aby aplikace sama ošetřila.

Ne všechny čárky a tečky v textu jsou interpunkčního významu. Proto bude takové automatické nahrazování k zlosti.

Výsledkem bude např. Nahrazování nedoporučuje 55, 5 procent návštěvníků diskuse. jakpsatweb. cz.
Taurus
Profil
Dovolím si přidat odkaz na www.liteera.cz/slovnik. Tečka a dvojtečka je ještě víc problematická.
MichalekII
Profil
Kajman:
Ne všechny čárky a tečky v textu jsou interpunkčního významu. Proto bude takové automatické nahrazování k zlosti.
>
Výsledkem bude např. Nahrazování nedoporučuje 55, 5 procent návštěvníků diskuse. jakpsatweb. cz.

Jsem si toho vědom, bohužel větší problém vzniká následným nezalamováním řádků, ruční úprava textu je také nemyslitelná. Zrovna u té čárky je to nejpalčivější.
Jsem však otevřen všem radám a názorům ...
user243
Profil
donny:
ten whille jsem přestřelil a regulárům se vyhýbám, protože se do toho vždycky zamotám;
donny
Profil
MichalekII:
Jsem si toho vědom, bohužel větší problém vzniká následným nezalamováním řádků, ruční úprava textu je také nemyslitelná. Zrovna u té čárky je to nejpalčivější.

Tak potom je niečo zle naprogramované (navrhnuté) už pri vstupe, pretože inak nerozumiem aký problém môže vznikať pri odoslaní textu obsahujúceho interpukčné znamienka (pravdepodobné s formuláru). Textový výstup predsa ošetrujeme ešte pred spracovaním, čo si tam reálne užívateľ zadá to už je jeho vec a ak to zadá zle hold bude to musieť opraviť, programátor robí aplikáciu, nemôže za užívateľa robit úplne všetko (napr. myslieť).
MichalekII
Profil
donny:
Tak,potom,je,niečo,zle,naprogramované,(navrhnuté),už,pri,vstupe,pretože,inak,nerozumiem,aký,problém,môže,vznikať,pri,odoslaní,textu,obsahujúceho,interpukčné,znamienka(pravdepodobné,s,formuláru).,Textový,výstup,predsa,šetrujeme,ešte,pred,spracovaním,čo,si,tam,reálne,užívateľ,zadá,to,už,je,jeho,vec,a,ak,to,zadá,zle,hold,bude,to,musieť,opraviť,programátor,robí,aplikáciu,nemôže,za,užívateľa,robit,úplne,všetko(napr.myslieť).

Klasický pc prohlížeč www si s tím (viz. upravená citace nahoře) poradí docela dobře avšak prohlížeče v mobilních telefonech s tím mají neskonalé potíže a deformují vzhled výsledné stránky.

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: