Autor Zpráva
habendorf
Profil
Na stránce (utf-8) mám vyhledávání přes google API, funguje bezvadně až na diakritiku.

Pokud zadám "reseni", najde všechny výskyty slova "řešení", což by zas tak moc nevadilo.
http://www.brs.cz/hledej.php?q=reseni

Pokud zadám "řešení", nenajde nic, což vadí dost.
http://www.brs.cz/hledej.php?q=%C5%99e%C5%A1en%C3%AD

Co s tím? Je možné to pro google nějak překódovat před odesláním? Nebo druhá možnost by byla, automaticky před odesláním odstranit diakritiku, tedy při "řešení" rovnou odeslat "reseni".
Tohle je ta podstatná část kódu:
$q = stripslashes ($HTTP_GET_VARS['q']);
$handle = @fopen ("http://search.digitalpoint.com/?q=" . urlencode ($q) . "&key=" . urlencode ($key) . "&site=" . urlencode ($site) . "&start=" . min (990, $start) . "&spell=" . $spelling, "r");

Můžete prosím někdo poradit?
habendorf
Profil
Aha, už jsem pokročil, jedna možnost je asi strtr().
$q = strtr($q, "ěšč....", "esc...");

Nešlo by to elegantněji?

PS: tak $q = strtr($q, "ěščřžýáíé", "escrzyaie"); bohužel nejde, na "řešení" to vrací "eieerení" (???)
Fred
Profil
OT:tak tohle je bomba, vůbec jsem o tom do nahlédnutí k tobě neslyšel, super díky: text-overflow:ellipsis
To řešení jsem našel, musel by jsi to převést do unicode viz: http://www.brs.cz/hledej.php?q=%26%23345%3B%26%23101%3B%26%23353%3B%26 %23101%3B%26%23110%3B%26%23237%3B
halogan
Profil
Odstraneni diakritky:
http://halogan.xblog.cz/archiv/2005/08/php-prakticky-generovani-seo-ur i

Naskytne se vsak jeden problem:
nekdo hleda (nic me ted nenapada, placnu blbost) bůček a ono mu to najde i buček, búčék, ...
Fred
Profil
Upřesním to ještě snad to fórum nerozbije, hledám tohle

řešení
Fred
Profil
Hm rozbilo, tak bez amp
habendorf
Profil
Chlapi bezva, díky moc. Nemám bohužel už čas, vyzkouším zítra a dám vědět.

Fred: na to text-overflow:ellipsis bacha, je to IE only.
Cenobit
Profil
Hi

a muze se google API pouzivat na komercnich webech? Nejak jsem to z licencnich podminek nepochopil (halt pravnicina jeste anglicky)))
habendorf
Profil
Tak jsem nakonec použil haloganovo řešení, i když sebou nese "bůčkový" problém. Ještě jsem ho doplnil o velká písmena.

Fred: tvoje řešení by se mi líbilo víc, ale nenašel jsem žádný spolehlivý a rozchoditelný způsob, jak udělat převod utf-8 -> unicode.
na to text-overflow:ellipsis bacha, je to IE only. - teď koukám že to je přímo z kódu vidět, takže upozornění bylo zbytečné

Díky všem.
llook
Profil
Největší problém bude asi převést řetězec do UCS-2, jestli hosting podporuje iconv, tak bude fungovat tohle:
$str = iconv('utf-8', 'ucs-2', 'řešení');

$buff = '';
for ($i=0; $i < strlen($str); $i += 2) {
$code = ord($str{$i}) + (ord($str{$i + 1}) << 8);
$buff .= '&amp;#' . $code . ';';
}
echo $buff;
habendorf
Profil
llook: Díky, bohužel asi nepodporuje. Dopadl jsem takhle:

Fatal error: Call to undefined function: iconv()

Mám tam $str = iconv('utf-8', 'ucs-2', $q); , v q je hodnota z formuláře.
Cenobit
Profil
Hi

mozna je to tim, ze fce iconv je v PHP az od verze 4 a/nebo tim ze se musi nainstalovat. Vice na http://mirrors.inway.cz/manual/en/ref.iconv.php
habendorf
Profil
Cenobit: Na to už jsem koukal předtím. Ale na hostingu těžko něco nainstaluju.
llook
Profil
Pokud není iconv, mbstring ani recode, pak nezbývá, než si napsat vlastní převaděč. Upravil jsem trochu funkci z toho článku o UTF-8 na Intervalu: http://interval.cz/clanek.asp?article=2940 (hlavně jsem to předělal pro PHP):
function convertFROMutf8($text) { 

$buff = '';
for($i = 0; $i<strlen($text); $i++) {
$kod = ord($text{$i});
if ($kod < 128) {
// standardnà ASCII
} else if (($kod & 0xE0) == 0xC0) {
$kod = (($kod & 0x1F) << 6) +
((ord($text{$i + 1}) & 0x3F));
$i += 1;
} else if (($kod & 0xF0) == 0xE0) {
$kod = (($kod & 0xF) << 12) +
((ord($text{$i + 1}) & 0x3F) << 06) +
((ord($text{$i + 2}) & 0x3F));
$i += 2;
} else if (($kod & 0xF8) == 0xF0) {
$kod = (($kod & 0x7) << 18) +
((ord($text{$i + 1}) & 0x3F) << 12) +
((ord($text{$i + 2}) & 0x3F) << 06) +
((ord($text{$i + 3}) & 0x3F));
$i += 3;
} else if (($kod & 0xFC) == 0xF8) {
$kod = (($kod & 0x3) << 24) +
((ord($text{$i + 1}) & 0x3F) << 18) +
((ord($text{$i + 2}) & 0x3F) << 12) +
((ord($text{$i + 3}) & 0x3F) << 06) +
((ord($text{$i + 4}) & 0x3F));
$i += 4;
} else if (($kod & 0xFC) == 0xF8) {
$kod = (($kod & 0x1) << 30) +
((ord($text{$i + 1}) & 0x3F) << 24) +
((ord($text{$i + 2}) & 0x3F) << 18) +
((ord($text{$i + 3}) & 0x3F) << 12) +
((ord($text{$i + 4}) & 0x3F) << 06) +
((ord($text{$i + 5}) & 0x3F));
$i += 5;
}
$buff .= '&#' . $kod . ';';
}
return $buff;
}
llook
Profil
Ten zmršenej znak na třetím řádku od konce je ampérsand a křížek, nějak to to fórum mrší:(
habendorf
Profil
llook: Super, díky, chodí bezvadně. Ale pořád to na "reseni" nachází i "řešení". Což ale možná není na škodu. Jen nedokážu posoudit, jestli je lepší použít tvoje, nebo haloganovo, hlavně co je rychlejší (ale tvoje je určitě univerzálnější).
habendorf
Profil
Ale pořád to na "reseni" nachází i "řešení".

Nebrat vážně, jsem magor. Vždyť to používá google!
http://www.google.com/search?hl=cs&q=reseni&lr=
:o))
Fred
Profil
Díky moc taky jsem to použil, mám ještě poddotaz, dá se nějak ten výsledek ještě doupravit, aby v něm nebyly ampersandy? Testuju to tady http://xy.wz.cz/search-test/search.php?q=%C5%99e%C5%A1en%C3%AD&start=0 a když dám druhou stránku vybuchne to kvůli xhtml na odkazu http://www.jakpsatweb.cz/komentare/diskuse.php?id=090608&title=Prost%C 5%99edn%C3%AD%20velikost%20p%C3%ADsma%20pou%C5%BE%C3%ADv%C3%A1%2092%25 %20Explorer%C5%AF&backlink=http://www.jakpsatweb.cz/weblog/a/109998048 0-prostredni-velikost-pisma-pouziva-92-exploreru.html
habendorf
Profil
Fred: No ruku na srdce, tohle je Yuhůův bordel v adresách, ne tvůj. Musel bys použít Str_Replace a měnit & na &-amp-;
Ale musel bys to ohlídat, aby když už by tam bylo původně &-amp-; tak aby fce Str_Replace už neproběhla.
(samozřejmě pomlčky jen kvůli chování této diskuze)
Fred
Profil
Hm pravda, tak to by snad ve skutečném chodu neměl být problém, teda doufám :-) Dík.
llook
Profil
Lepší než str_replace bude htmlspecialchars.
Jirka46468
Profil *
Lidičky já to pořád nechápu a češtinu mi to nevrací správně. Vyšel jsem z příkladu vysvětleného na adrese http://www.fiftyfoureleven.com/weblog/web-development/programming-and- scripts/apis/google-search-api. Funguje mi to ale ještě bych do toho potřeboval hodit tu češtinu. Stránky ze kterých hledám jsou teď ve cp-1250 ale i když jsem je hodil do utf-8 tak to nechodí správně.

Pak ještě jedna maličkost, ve výsledcích se zobrazují html tagy, např. <b> nebo <a> tak jak jsou v prohledávaném textu. Bylo by fajn je buď odfiltrovat nebo je interpretovat ale ne zobrazit jako zdrojový kód :-)

Doufám, že mi poradíte, je to prima funkce, kterou určitě nevyužiju jen já. Díky Jirka.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0