« 1 2 »
Autor Zpráva
filiphk
Profil
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
filiphk
zkus se podívat na urldecode
Radim24
Profil *
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
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
Radim24: Vycházel jsem z tohoto článku: http://latrine.dgx.cz/odstraneni-diakritiky-z-ruznych-kodovani
nightfish
Profil
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 *
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
Taps: Jak mám prosím to urldecode použít, abych dosáhl požadovaného výsledku?
Radim Hejhal
Profil
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
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
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
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
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
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 *
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 *
htmlentities nahrazuje diakritiku a ošetřuje jí....
calvary
Profil *
Nebo si vytvoř ještě header na začátku skriptu
<?php
header("Content-type: text/html; charset=utf-8");
?>
filiphk
Profil
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
calvary
Zkusím to, dobrý nápad :o)
filiphk
Profil
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
Zkoušel už někdo ten postup od calvaryho?
filiphk
Profil
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 *
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 *
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
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 *
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 *
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
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 *
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 *
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>
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.

0