Autor | Zpráva | ||
---|---|---|---|
MichalekII Profil |
#1 · Zasláno: 19. 2. 2013, 05:59:49
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 |
#3 · Zasláno: 19. 2. 2013, 09:15:10
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 |
#4 · Zasláno: 19. 2. 2013, 09:44:04
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 |
#5 · Zasláno: 19. 2. 2013, 09:46:56
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 |
#6 · Zasláno: 19. 2. 2013, 15:05:03
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 |
#7 · Zasláno: 19. 2. 2013, 19:55:36
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 |
#9 · Zasláno: 20. 2. 2013, 10:15:02
Tori:
a zkusit to nějak takto? $retezec = "jablko,meloun,kiwi;mrkev, brambora, česnek."; $nahradit = array(", " => ", ", "; " => "; ", ". " => ". ", "," => ", ", ";" => "; ", "." =>". "); $retezec = strtr($retezec, $nahradit); |
||
Tori Profil |
|||
Camo Profil |
#11 · Zasláno: 20. 2. 2013, 11:37:25
$a1=array(',',';',' '); $a2=array(', ','; ',' '); str_replace($x,$a1,$a2); |
||
donny Profil |
#12 · Zasláno: 20. 2. 2013, 11:48:23
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 |
#14 · Zasláno: 20. 2. 2013, 12:10:11
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 |
#15 · Zasláno: 20. 2. 2013, 14:38:18
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 |
#16 · Zasláno: 20. 2. 2013, 15:18:40
No jasné, hlavne že tomu rozumieš...
|
||
1Pupik1989 Profil |
#17 · Zasláno: 20. 2. 2013, 15:41:54
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 |
#18 · Zasláno: 20. 2. 2013, 16:23:23
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 |
#19 · Zasláno: 20. 2. 2013, 16:31:12
Dovolím si přidat odkaz na www.liteera.cz/slovnik. Tečka a dvojtečka je ještě víc problematická.
|
||
MichalekII Profil |
#20 · Zasláno: 20. 2. 2013, 17:31:45
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 |
#21 · Zasláno: 20. 2. 2013, 17:45:42
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 |
#23 · Zasláno: 21. 2. 2013, 10:44:04
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. |
||
Časová prodleva: 11 let
|
0