Autor | Zpráva | ||
---|---|---|---|
filiphk Profil |
#1 · Zasláno: 23. 7. 2008, 01:48:40
Dobrý den,
na http://www.filda.cz/vyznam-jmen mám vyhledávání jmen, které probíhá přes funkci GET. Jednotlivá jména nejsou uložena v DB, ale v textovém souboru. Ten obsahuje také klíčová slova pro hledání, jež jsou bez diakritiky a malými písmeny. Web používá kódování windows-1250. Pomocí následujícího kódu se mi podařilo docílit toho, že odeslaný dotaz je zbaven diakritiky a velkých písmen: function nodia($dia) {$dia =StrTr($dia,"\xe1\xe4\xe8\xef\xe9\xec\xed\xbe\xe5\xf2\xf3\xf6\xf5\xf4\ xf8\xe0\x9a\x9d\xfa\xf9\xfc\xfb\xfd\x9e\xc1\xc4\xc8\xcf\xc9\xcc\xcd\xb c\xc5\xd2\xd3\xd6\xd5\xd4\xd8\xc0\x8a\x8d\xda\xd9\xdc\xdb\xdd\x8e", "aacdeeillnoooorrstuuuuyzAACDEEILLNOOOORRSTUUUUYZ"); $dia = StrToLower($dia); return $dia;}; $jmeno = nodia($jmeno); Nyní k problému: Pokud dám vyhledat např. jméno "Tomáš", hodnota v adresním řádku zůstane v podobě "Tom%E1%9A", tedy nepřevede se. Pročetl jsem již mnoho článků a diskuzí na toto téma, díval se i do PHP manuálu, ale mé snažení zatím bylo bezúspěšné. Budu moc vděčný, pokud mi někdo s tímto problémem poradí. Úkázka z mého kódu: <form action='' method='get'> <input type='hidden' name='hledat' value='dotaz' />Zadejte jméno: <p><input type='text' name='jmeno' size='25' maxlength='25' /></p> <p><input type='submit' value='hledat' /></form></p>"; if($_GET[hledat] == "dotaz") {$user = file("jmena.txt"); $lis = 0; |
||
Taps Profil |
#2 · Zasláno: 23. 7. 2008, 07:20:17
filiphk
zkus se podívat na urldecode |
||
Radim24 Profil * |
#3 · Zasláno: 23. 7. 2008, 08:38:00
já bych se chtěl zase zeptat co znamenají ty \xe... to jako je nějaký kód znaku jo? Proč nepsat $str,"ěščřžýáíé","escrzyaie"?
|
||
filiphk Profil |
#4 · Zasláno: 23. 7. 2008, 08:47:12
Přes urldecode jsem to zkoušel, ale bohužel také zatím bez úspěchu. Použil jsem např. níže uvedený kód, ale v adresním řádku mi stále po odeslání dotazu zůstává za "&" hodnota obsahující "%".
<?php $a = explode('&', $QUERY_STRING); foreach($a as $key => $b) { $b = split('=', $b); echo 'Value for parameter '.htmlspecialchars(urldecode($b[0])).' is '.htmlspecialchars(urldecode($b[1]))."<br />\n"; } ?> Pokud jsem to předtím napsal možná trochu složitě, tak to zjednoduším: 1. zadám jméno "Tomáš" a stisknu "Hledat" 2. v adresním řádku se mi objeví "?hledat=dotaz&jmeno=Tom%E1%9A", ale chtěl bych, aby tam bylo "?hledat=dotaz&jmeno=tomas", bez ohledu na to, zda dotaz byl zadán jako "Tomáš", "tomáš" apod. Lámu si s tím hlavu už asi 14 dní, ale zřejmě někde dělám nějakou chybu. Nenapsal by někdo prosím přímo nějaký příklad, který by se dal použít? |
||
filiphk Profil |
#5 · Zasláno: 23. 7. 2008, 08:54:40
Radim24: Vycházel jsem z tohoto článku: http://latrine.dgx.cz/odstraneni-diakritiky-z-ruznych-kodovani
|
||
nightfish Profil |
#6 · Zasláno: 23. 7. 2008, 08:56:07
Radim24
to jako je nějaký kód znaku jo? Proč nepsat $str,"ěščřžýáíé","escrzyaie"? protože když pak omylem/úmyslně uložíš soubor v jiném kódování, tak to s největší pravděpodobností nebude fungovat... |
||
Radim24 Profil * |
#7 · Zasláno: 23. 7. 2008, 15:08:51
Já jen, že mi to přijde jako jednodušší vyrianta. Já osobně zatím nenarazil na problém, že bych to potřeboval ukládat v jiném kodovani.
|
||
filiphk Profil |
#8 · Zasláno: 23. 7. 2008, 18:23:28
Taps: Jak mám prosím to urldecode použít, abych dosáhl požadovaného výsledku?
|
||
Radim Hejhal Profil |
#9 · Zasláno: 23. 7. 2008, 18:59:12
filiphk
No, problém je podle mě v tom, že vytváření adresy při odeslání formuláře metodou GET řídí prohlížeč, takže to převedení znaků nemůžeš pomocí PHP přímo ovlivňovat. Napadají mě řešení dvě: 1. pomocí PHP: přijmeš GET hodnoty, převedeš %E1 a podobnej bordel na normální znaky bez diakritiky, sestavíš znovu adresu a uživatele na tuto adresu přesměruješ. 2. pomocí JS: při odeslání formuláře se spustí funkce, která v inputu se jménem odstraní diakritiku a pak teprve formulář odešle. A pojistit to tou PHP funkcí pro lidi, který mají JS vypnutej. |
||
filiphk Profil |
#10 · Zasláno: 23. 7. 2008, 19:37:59
Radim Hejhal: Díky za rady, v mém případě by asi bylo nejlepší použít první tebou popisovaný postup. Přesměrování by se dalo udělat třeba přes "header(location)", v tom nevidím problém, ale jak mám prosím převést "%E1" apod. na znaky bez diakritiky při použití metody get? Nenapsal bys prosím jak by to vypadalo přímo v kódu?
Omlouvám se, zda jsou mé dotazy pro někoho možná až banální, ale pronikat do problematiky a funkčnosti php podmínek jsem začal teprve nedávno, takže se zatím učím. |
||
Radim Hejhal Profil |
#11 · Zasláno: 23. 7. 2008, 20:48:22 · Upravil/a: Radim Hejhal
filiphk
Fungovat by to mohlo například takhle: <?php if ($_GET['jmeno'] AND $_GET['hledat'] == 'dotaz') { $jmeno = Str_Replace( Array("á","č","ď","é","ě","í","ľ","ň","ó","ř","š","ť","ú","ů","ý","ž", "Á","Č","Ď","É","Ě","Í","Ľ","Ň","Ó","Ř","Š","Ť","Ú","Ů","Ý","Ž","ä", "ë","ü","ö","Ä","Ë","Ü","Ö","ő","ô","ŕ","ű","ĺ", "Ĺ","Ő","Ô","Ŕ","Ű"), Array("a","c","d","e","e","i","l","n","o","r","s","t","u","u","y","z", "a","c","d","e","e","i","l","n","o","r","s","t","u","u","y","z","a", "e","u","o","a","e","u","o","o","o","r","u","l", "l","o","o","r","u"), $_GET['jmeno']); header('Location: http://www.filda.cz/vyznam-jmen?hledat=otazka&jmeno='.$jmeno); exit; } ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Zkouška GET diakritiky</title> </head> <body> <form method="GET"> <input type="text" name="jmeno"> <input type="submit" name="hledat" value="dotaz"> </form> <?php if ($_GET['jmeno'] AND $_GET['hledat'] == 'otazka') { echo "Kód pro nalezení jména a vysvětlení významu."; } ?> </body> </html> Poznámky: - script i výsledná stránka jsou v UTF-8 - ta překládací funkce nebude asi nejrychlejší, šáhl jsem po té co jsem tu měl v nějakém starém scriptu, můžeš jí vyměnit za jinou - přesměrovávám uživatele se zkontrolovaným jménem na adresu kde není hledat=dotaz, ale hledat=otazka, aby se snadno poznalo že už jméno prošlo kontrolou. To není moc efektivní ani hezký, ale nic lepšího co by bylo jednoduché a rychlé mě zrovna nenapadlo - vyzkoušel jsem to, funguje to A mimochodem - fakt pěknej web ;o) |
||
filiphk Profil |
#12 · Zasláno: 23. 7. 2008, 22:50:51
Radim Hejhal
Moc děkuju, vyzkouším a dám vědět, jak jsem dopadl. Nevadí, když to "přeložení" chvíli potrvá, hlavně když to bude fungovat. :c) |
||
filiphk Profil |
#13 · Zasláno: 24. 7. 2008, 03:35:56
Radim Hejhal
Tak už mi to funguje. :c) Jelikož jsem použil původní "převodník", stačilo vyjma drobných úprav nakonec do kódu přidat následující řádek: if($_GET['jmeno'] AND $_GET['hledat'] == 'nic') {header('Location: http://www.filda.cz/vyznam-jmen?hledat=dotaz&jmeno='.$jmeno); exit;}; Hodnotu "dotaz" jsem změnil na "nic", protože se zobrazuje pouze v případě, kdy není zadáno žádné písmenko. Hodnotu "otazka" jsem změnil na "dotaz". Trošku mě však teď trápí, že mám hledaný dotaz malými písmeny i v "title", ale jelikož je posílán přes "header", tak se s tím asi nic nedá dělat. |
||
filiphk Profil |
#14 · Zasláno: 24. 7. 2008, 05:34:18
Vyřešeno pomocí ucwords :c)
Teď už jen zbývá nastavit, aby se po odeslání odstanily "nežádoucí znaky" jako jsou mezera, tečka, pomlčka ... a případně i čísla, ale to už snad nějak zvládnu. |
||
calvary Profil * |
#15 · Zasláno: 24. 7. 2008, 15:29:25
Zkoušel si tohle?
<?php $a = explode('&', $QUERY_STRING); foreach($a as $key => $b) { $b = split('=', $b); echo 'Value for parameter '.htmlspecialchars(htmlentities($b[0])).' is '.htmlspecialchars(htmlentities($b[1]))."<br />\n"; } ?> |
||
calvary Profil * |
#16 · Zasláno: 24. 7. 2008, 15:30:57
htmlentities nahrazuje diakritiku a ošetřuje jí....
|
||
calvary Profil * |
#17 · Zasláno: 24. 7. 2008, 15:39:11
Nebo si vytvoř ještě header na začátku skriptu
<?php header("Content-type: text/html; charset=utf-8"); ?> |
||
filiphk Profil |
#18 · Zasláno: 24. 7. 2008, 19:04:16 · Upravil/a: filiphk
calvary
Výsledek mého snažení je zde: http://www.filda.cz/vyznam-jmen Tvůj postup také vyzkouším, i když celkově už jsem to vyřešil následovně: $jmeno = preg_replace('/([1234567890@#$%&* )]+)/','',$jmeno); // odstranění čísel, mezer a znaků "@#$%&*" function nodia($dia) {$dia = StrTr($dia,"\xe1\xe4\xe8\xef\xe9\xec\xed\xbe\xe5\xf2\xf3\xf6\xf5\xf4\x f8\xe0\x9a\x9d\xfa\xf9\xfc\xfb\xfd\x9e\xc1\xc4\xc8\xcf\xc9\xcc\xcd\xbc \xc5\xd2\xd3\xd6\xd5\xd4\xd8\xc0\x8a\x8d\xda\xd9\xdc\xdb\xdd\x8e", "aacdeeillnoooorrstuuuuyzAACDEEILLNOOOORRSTUUUUYZ"); // funkce, která odstraní diakritiku $dia = StrToLower($dia); return $dia;}; // převod velkých písmen na malá $jmeno = nodia($jmeno); // použití funkce, která odstraní diakritiku if($_GET['jmeno'] AND $_GET['hledat'] == 'nic') {header('Location: http://www.filda.cz/vyznam-jmen?hledat=dotaz&jmeno='.$jmeno); exit;}; // použití všech předchozích pravidel na hodnotu v adresním řádku $jmeno2 = $jmeno; $jmeno2 = ucwords($jmeno2); // převod prvního písmene na velké; hodnota "jmeno2" je vytvořena proto, aby se tato změna neprojevila v adresním řádku |
||
Radim Hejhal Profil |
#19 · Zasláno: 24. 7. 2008, 19:42:08
calvary
Zkusím to, dobrý nápad :o) |
||
filiphk Profil |
#20 · Zasláno: 25. 7. 2008, 03:17:39 · Upravil/a: filiphk
calvary
Tak mi to bohužel nefunguje, diakritika tam vždy zůstane, ale zřejmě do toho skriptu jen špatně dosazuji proměnou "$jmeno", kterou potřebuji zpracovat. Nemohl bys prosím napsat, kam ji přesně dosadit? Radim Hejhal Pokud by se ti povedlo rozchodit ten skript od calvaryho, napiš prosím, jak jsi toho docílil. Sice mi ten současný skript funguje, ale tento vypadá podstatně jednodušeji. pro všechny Ještě jeden dotaz, který tak úplně nesouvisí s tématem, ale přišlo mi zbytečné kvůli tomu zakládat nové vlákno: Na stránkách jsem použil následující kód, který nahrazuje "<br />" za "mezeru". Sice mi to funguje, ale neprojde to validátorem. Dá se zmíněná funkce napsat nějak jinak či ji nahradit, aby stránka pak byla validní? $nahradit = eregi_replace("<br />"," ",$nahradit); Vyřešeno: $text = Str_Replace("<br />"," ",$text); |
||
filiphk Profil |
#21 · Zasláno: 26. 7. 2008, 03:03:17
Zkoušel už někdo ten postup od calvaryho?
|
||
filiphk Profil |
#22 · Zasláno: 28. 7. 2008, 04:08:06
calvary
Jak mám prosím použít tento tvůj příklad? $a = explode('&', $QUERY_STRING); foreach($a as $key => $b) { $b = split('=', $b); echo 'Value for parameter '.htmlspecialchars(htmlentities($b[0])).' is '.htmlspecialchars(htmlentities($b[1]))."<br />\n"; } Jako výsledek se mi pořád zobrazuje "0". |
||
calvary Profil * |
#23 · Zasláno: 28. 7. 2008, 07:51:51
foreach($a as $key=>$b) {
$b = split'=', $b); echo "Value for parameter ".htmlspecialchars(hmtlentities($b[0]))." is ".htmlspecialchars(htmlentities($b[1]))." atd."; Ale už ti to funguje ne?Aspň mě ano. Každopádně, pokud to píšeš .txt tak si dávej pozor, s jakým kódováním to ukládáš. Např. File->Save as->neco.txt a podtím vybrat UTF-8 + s hlavičkou jak sem poslal nahoře. |
||
calvary Profil * |
#24 · Zasláno: 28. 7. 2008, 08:00:39
Popřípadně z SQL dotazu z DB můžeš použít i stripslashes nebo get_magic_quotes_gpc(), ošetřování je spousta:)
Hlavně mrkni na to ukládání toho txt v tom to bude na 99%, ale i v něčem jiným, zkusit se má vše:) |
||
filiphk Profil |
#25 · Zasláno: 28. 7. 2008, 08:11:39 · Upravil/a: filiphk
calvary
Přiznám se, že tomu Tvému příkladu vůbec nerozumím. Nevím, zda tam to "$a as $key=>$b" nechat, nebo za to dosadit svou proměnnou. V třetím řádku nevím, proč tam je ta 0 a 1. Už mi to funguje, ale na základě příkladu od Radima Hejhala. Tvůj postup se mi zdál jednodušší, tak jsem ho chtěl taky vyzkošet. |
||
calvary Profil * |
#26 · Zasláno: 28. 7. 2008, 08:30:50
Jak vypisuješ jména tak před to hodit ten můj příklad.Linkni mi tvůj aktuální kód prosimtě, taky sem se v tom zamotal trochu
|
||
calvary Profil * |
#27 · Zasláno: 28. 7. 2008, 08:58:26
Ale koukám, že to pořád nemáš ošetřený, zadám na zkoušku O'neil a vjede mi O\\neil ukaž mi tu část kódu prosimtě
|
||
filiphk Profil |
#28 · Zasláno: 28. 7. 2008, 12:05:29
calvary
Převodem diakritiky bych se už nezabýval, jelikož to už mám vyřešeno. Potřeboval bych teď ošetřit právě ty nepovolené znaky u formuláře, v současnoti to dělám takto: {$sign = Str_Replace (Array(" ","1","2","3","4","5","6","7","8","9","0","@","#","$","%","^","&","?", "!","*","_","-","+","=",".",":",";",",","Q","q","~","/","(",")","<","> ","[","]","{","}","°","§","/"),"",$sign); return $sign;}; $jmeno = nosign($jmeno); Vím, že to není zrovna nejlepší řešení, navíc pokud tam přidám \ a ' (kterou to z neznámého důvodu převádí na \), tak mi to vyhodi parse error. Prostě bych nějak lépe potřeboval udělat, aby do formuláře bylo možné zadávat jen písmena, vyjma q, které slouží v textovém souboru se jmény jako dělící znak. Jinak děkuji za tvou trpělivost se mnou, ale jak jistě sám víš, každý začátek je těžký :-) |
||
calvary Profil * |
#29 · Zasláno: 28. 7. 2008, 12:32:28
Jasný:)
Tady se mrkni na příklad.(s chybou) <?php echo htmlspecialchars(htmlentities($text)) ; ?> <form method="post" action="pokus.php"> Tetx <input type="text" name="text" value="".htmlspecialchars(htmlentities($text)).""> <input type="submit"> </form> Ono htmlentities je na diakritiku, ale na ",' atd je stripslashes tzn. <?php echo htmlspecialchars(stripslashes($text)) ; ?> <form method="post" action="pokus.php"> Tetx <input type="text" name="text" value="".htmlspecialchars(stripslashes($text)).""> <input type="submit"> </form> Teď to zkus:) |
||
calvary Profil * |
#30 · Zasláno: 28. 7. 2008, 12:53:02
Asi nejlíp to bude asi takhle:
<?php echo stripslashes($text) ; ?> <form method="post" action="pokus.php"> Tetx <input type="text" name="text" value="".htmlspecialchars(stripslashes($text)).""> <input type="submit"> </form> |
||
Téma pokračuje na další straně.
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0