| | |
| Stránka: 1 z 1
| [ Príspevkov: 22 ] | |
Autor | Správa |
---|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice |
Vyhladavanie slova v texte som spravil takto: Vytvoril som stlpec v databaze, kde bude kopia povodneho textu, ale bez diakritiky a malymi pismenami. Ten isty text s diakritikou je tiez normalne v databaze. To odstranenie diakritiky mam takto: $dia = "áäčďéíľĺňóôŕšťúýžÁČĎÉÍĽĹŇÓŠŤÚÝŽ";
$nodia = "aacdeillnoorstuyzACDEILLNOSTUYZ";
$searchx = strtr($_POST['search'], $dia, $nodia);
$searchx = strtolower($searchx);
Cize aj vyhladavane slovo sa prevedie na male pismena a odstrani sa diakritika.
Problem je ale v tom, ze hoci mi najde hladane slovo v texte bez problemov, neviem ho zvyraznit. Proste chcem, aby najdene slovo v texte bolo zvyraznene tucnym. A kedze vyhladava v texte bez diakritiky a ja potrebujem oznacit slovo v texte s diakritikou, vznika vazny problem ... Za normalnych okolnosti by fungovalo toto:
kód:
$zaznam=eregi_replace( $searchx,'.$searchx.',$zaznam);
lenze takto to nezvyrazni, ak je tam diakritika, kedze vyhladava v texte bez diakritiky. Nedalo by sa nejako tak, ze by zistilo poziciu najdeneho slova v texte bez diakritiky a ta ista pozicia bude presne aj v texte s diakritikou, a to slovo by zobrazilo? Nenapada ma vobec nic, vedel by niekto helfnut?
|
|
Registrovaný: 17.10.06 Prihlásený: 08.01.11 Príspevky: 1752 Témy: 17 | Napísal suchy: 16.03.2008 11:57 | |
|
skus pozret strpos();
_________________ A Real Programmer might or might not know his wife's name. He does, however, know the entire ASCII code table. |
|
Registrovaný: 01.01.06 Prihlásený: 25.12.21 Príspevky: 366 Témy: 47 Bydlisko: TT | Napísal jaji: 16.03.2008 12:03 | |
|
... preco mas v DB 2 rovnake texty s a bez diakritiky? Neni to plytvanie priestorom cez DB?
No, ale jedno riesenie, take nudzove (1. co ma napadlo), ale je:
zisti si ze kolkate je to slovo v texte bez diakritiky (nacitat do pola cez explode) a potom vypisovat slova a najdes to hladane, zvyraznis ako si napisal....
Zdrojak spravis lahko, hadam ho netreba pisat, ked si zvladol hento predtym....
... ale ak chces efektivnejsie, pozri si regularne vyrazy, alebo videl som o tom vela clankov, pogoogli, urcite najdes, len treba hladat
_________________ He who laughs last has not yet heard the bad news.
-- Bertolt Brecht
medicine student |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 16.03.2008 14:14 | |
|
pomocou regul. vyrazov mi to neslo. Skusal som toto (vdaka stenleymu) Kód: $dia = "áäčďéíľĺňóôŕšťúýÁČĎÉÍĽĹŇÓŠŤÚÝŽ"; $nodia = "aacdeillnoorstuyacdeillnostuyz";
$convtbl_search = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
$convtbl_replace = array('[aáäAÁ]', '[bB]', '[cčCČ]', '[dďDĎ]', '[eéEÉ]', '[fF]', '[gG]', '[hH]', '[iíIÍ]', '[jJ]', '[kK]', '[lľĺLĽĹ]', '[mM]', '[nN]', '[oóôOÓ]', '[pP]', '[qQ]', '[rŕRŔ]', '[sšSŠ]', '[tťTŤ]', '[uúUÚ]', '[vV]', '[wW]', '[xX]', '[yýYÝ]', '[zžZŽ]');
$search = strtr($search, $dia, $nodia); $regexp = str_replace($convtbl_search, $convtbl_replace, $search); ale potom som nevedel, ako zapisat do mysql_query. Lebo mam takto Kód: $hladat=mysql_query("SELECT * FROM tabulka WHERE nazov LIKE '%".$search."%' OR text LIKE '%".$search."%'"); a ako tam zaclenit aj to $regexp . No a potom mam tiez problem pri zvyrazneni toho slova Kód: $zaznam=eregi_replace( $search,'<strong>'.$search.'</strong>',$zaznam); Alebo druha moznost, co som skusal: Kód: function TextToRegtext($text) // funkcia prekonvertuje vstupny text po jednom znaku tak ze vzhlada vstupny // znak v $sources a do vystupu zapise jeho ekvivalent z $replace. Ak znak nenajde // do vystupu zapise zdrojovy znak { $sources = array("aáäAÁÄ","bB","cCčČ","dDďĎ","eéeëEÉEË", "fF","gG","hH","iIíÍ","jJ","kK","lĺľLĹĽ", "mM","nN","oóöôOÓÖÔ","pP","qQ","rŕřRŔŘ", "sšSŠ","tťTŤ","uúuüUÚUÜ","vV","wW","xX", "yýYÝ","zžZŽ"); $replace = array("[a,á,ä,A,Á,Ä]","[b,B]","[c,C,č,Č]","[d,D,ď,Ď]","[e,é,e,ë,E,É,E, Ë]", "[f,F]","[g,G]","[h,H]","[i,I,í,Í]","[j,J]","[k,K]","[l,ĺ,ľ,L,Ĺ,Ľ]", "[m,M]","[n,N]","[o,ó,ö,ô,O,Ó,Ö,Ô]","[p,P]","[q,Q]","[r,ŕ,ř,R,Ŕ,Ř]", "[s,š,S,Š]","[t,ť,T,Ť]","[u,ú,u,ü,U,Ú,U,Ü]","[v,V]","[w,W]","[x,X]", "[y,ý,Y,Ý]","[z,ž,Z,Ž]"); $regtext = ""; for ($j = 0; $j < mb_strlen($text,'UTF-8'); $j++) { for ($k = 0; $k < count($sources); $k++) { $Decoded = false; if (mb_stristr($sources[$k], mb_substr($text,$j,1,'UTF-8')) != false) { $regtext = $regtext.$replace[$k]; $Decoded = true; break; } } if (!$Decoded) { $regtext = $regtext."[".mb_substr($text,$j,1,'UTF-8')."]"; } } return $regtext.""; }
ale ten isty problem - nevyhladava mi to spravne, neviem to ako zapisat do mysql_query. Preto som volil jednoduchsiu moznost s tou kopiou textu bez diakritiky. Tak to funguje pekne, az na to zvyraznenie slova.
Uvitam kazdu pomoc, uz som nad tym dumal nejednu noc ....
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
tiez si myslim, ze mat v db v podstate duplicitny text, je zbytocne...
na co si potom generoval $regexp, ked si ho nepouzil? regularne vyrazy (ako take) sa nedaju pouzit v LIKE - preto ti to neslo, na to sluzi REGEXP, napr:
Kód: SELECT * FROM tabulka WHERE text REGEXP '$regexp' Ale generovat ho budes musiet tak ci tak, lebo ho s vyhodou mozes pouzit pri zvyrazneni: Kód: eregi_replace($regexp, '<strong>\\0</strong>', $zaznam);
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 16.03.2008 15:02 | |
|
ja som to najprv mal napisane presne takto, ako si teraz pisal Kód: SELECT * FROM tabulka WHERE text REGEXP '$regexp' len som nevedel, ze ci je to tak spravne, pretoze mi to tak nefungovalo. Nenaslo mi niektore slova. Napr. mam v texte slovo databáza, a dám hladat napr. slovo bá, to najde v pohode, aj pekne vyznaci, ale ked uz dam hladat báz, tak nenajde nic... a tak je to s mnohymi slovami, nenachadza mi vsetky slova, ktora tam na 100 percent v texte su... Alebo napr. hladam slovo Bá, to najde, ale BÁ uz nenajde vobec. ked pouzijem ten druhy sposob function TextToRegtext($text) , co som vyssie pisal, tu uz najde viacej, aj ked napisem BÁ, atd... ale nenajde ani tu napr. baz, ani báz, ani bázy,bazy... ale napr. slovo databá najde., ale uz databáz nie. Rozmyslal som, ci nepridat znak % do query: Kód: SELECT * FROM tabulka WHERE text REGEXP 'SELECT * FROM tabulka WHERE text REGEXP '%$regexp%' ale takto to uz vobec nejde... Niekde som cital, ze by mohlo pomoct COLLATE, ale mne to tak neberie, neviem akym sposobom to tam dat Kód: $hladat=mysql_query("SELECT * FROM tabulka WHERE text REGEXP '$regexp' COLLATE 'utf8_general_ci' "); ale takto to nie je spravne...
|
|
Registrovaný: 01.01.06 Prihlásený: 25.12.21 Príspevky: 366 Témy: 47 Bydlisko: TT | Napísal jaji: 16.03.2008 19:19 | |
|
skus toto, co som hovoril
Kód: $hladat="hladaj"; //vloz hladany retazec bez diakritiky $text="Ano, hladaj skrikol dedo.";// tu je ta duplicita textu z DB bez dia $text_o="Áno, hľadaj skríkol dedo.";// text z DB s diakritikou $a=explode(' ',$text); $b=explode(' ',$text_o);
for ($i=0; $i<=count($a); $i++) { if (strtolower($hladat)==strtolower($a[$i])) $b[$i]="<b>$b[$i]</b>" ; $b[i]="<b>$b[i]</b>"; $vysledok=$vysledok." ".$b[$i]; trim($vysledok); } echo "$vysledok";
|
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 16.03.2008 20:51 | |
|
hm, no ak s tym regexpom nevie nikto poradit, budem musiet asi zostat pri tej tvojej verzii jaji...
Vedel by sa este k tomu niekto vyjadrit? Stenley? To s tym regexpom mi nevyhladava vsetko, nevies v com moze byt problem?
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
Prave pozeram, kde moze byt problem, lebo je to pre mna zahadou, ze to nefunguje tak, ako by asi malo...
//problem bude pravdepodobne v tomto:
The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal. ( http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html)
Pomoct by mohlo http://udf-regexp.php-baustelle.de/trac/wiki/WikiStart
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 1:12 | |
|
hm... tusil som, ze to bude problem kodovania a nedokonalosti regexpu... Nagooglil som o tom desiatky stran, ale spolahlive riesenie tu asi nie je ...
myslim ze zotrvam pri tom prvom rieseni bez diakritiky... na mnohych fulltextovych vyhladavacoch to maju podobne. Vdaka vsetkym za pomoc!
PS: jaji: ten tvoj script na oznacenie najdeneho slova mi hadze chybu Kód: Fatal error: Maximum execution time of 5 seconds exceeded in domains/..... Zda sa ze to vykonava prilis dlho, a server neakceptuje take dlhe ukony... asi sa vykaslem na to, a jednoducho to necham tak aby len nasiel text a nebudem ho oznacovat... nechce sa mi verit, ze sa neda spravit nejaky riadny fulltextovy vyhladavac...
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
ak uz mas vyriesene vyhladavanie, tak zvyraznovanie hladaneho slova mozes spravit jednoducho cez ereg_replace
//regexp bohuzial nepracuje spravne s utf8, co je dost skoda, ale skusal si uz pouzit cisto len LIKE s collate utf8_general_ci? Vyskusal som to a vysledok je taky, ze ak mas v db napr. slovo "databáza" a das vyhladat trebars retazec "ážá", tak to najde v pohode...
Naposledy upravil stenley dňa 17.03.2008 9:02, celkovo upravené 1
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 8:58 | |
|
no pomocou ereg_replace by som musel nahradit najdene slovo v texte bez diakritiky slovom v texte s diakritikou... a to sme tam kde sme boli... Kód: $zaznam=ereg_replace( $search,'<strong>'.$search.'</strong>',$zaznam); toto by mi zvyraznilo len hladany retazec. Takze ak mam v texte slovo číslo, a uzivatel hladal cislo, tak mi zvyrazni a vypise cislo, i ked povodne v texte bolo číslo. Logicke.
To by slo len tak nejako, ze nahradi hladany retazec na danej pozicii bez diakritiky retazcom presne na tej istej pozicii bez diakritiky... a to uz sme pri serverzatazujucom jajiho scripte.
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
"problem je" v utf-8, lebo keby si napr. pouzival iso-8859-2, tak by tento zapis zvyraznil vsetko, co potrebujes:
Kód: $zaznam = "misko miško michal mískó MÍško"; $search = "misko"; //hladany vyraz $regexp = "m[ií][sš]k[oó]"; //regexp zo $search
echo eregi_replace($regexp, '<strong>\\0</strong>', $zaznam);
Vysledok by bol: misko miško michal mískó MÍško
//pozri si moj predchadzajuci prispevok o regexp vs. like
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 10:04 | |
|
neviem, ale mne to iso-8859-2 nefunguje dobre. Ak dam toto kodovanie, namiesto š,ž mi zobrazuje ?, a namiesto ľ zobrazi ž, atd... tym padom nenajde ziadne hladane slovo, kedze vsetky znaky su inak zobrazene...
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
to bude asi preto, lebo mas db a tabulku v utf8, nie?
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 10:41 | |
|
v databaze som nenasiel kodovanie ISO, tak som zmenil na cp1250_general_ci, lebo celu stranku mam win-1250, ale nepomohlo ani to...
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
iso-8859-2 je v db latin2 a na stranke iso-8859-2
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 11:22 | |
|
skusim to tak, ale az niekedy vecer... dam vediet...
|
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 12:37 | |
|
Inak ked som skusal to ISO kodovanie na stranku, tak mi prepisalo na tie cudne znaky aj samotny text na stranke, ktory nema nic spolocneho s databazou...
|
|
Registrovaný: 01.01.06 Prihlásený: 25.12.21 Príspevky: 366 Témy: 47 Bydlisko: TT | Napísal jaji: 17.03.2008 16:08 | |
|
neopagan píše: hm... tusil som, ze to bude problem kodovania a nedokonalosti regexpu... Nagooglil som o tom desiatky stran, ale spolahlive riesenie tu asi nie je ... myslim ze zotrvam pri tom prvom rieseni bez diakritiky... na mnohych fulltextovych vyhladavacoch to maju podobne. Vdaka vsetkym za pomoc! PS: jaji: ten tvoj script na oznacenie najdeneho slova mi hadze chybu Kód: Fatal error: Maximum execution time of 5 seconds exceeded in domains/..... Zda sa ze to vykonava prilis dlho, a server neakceptuje take dlhe ukony... asi sa vykaslem na to, a jednoducho to necham tak aby len nasiel text a nebudem ho oznacovat... nechce sa mi verit, ze sa neda spravit nejaky riadny fulltextovy vyhladavac...
mne to na localhoste ide uplne v poho....
|
|
Registrovaný: 27.07.07 Príspevky: 3948 Témy: 51 Bydlisko: Bratislava |
neopagan píše: Inak ked som skusal to ISO kodovanie na stranku, tak mi prepisalo na tie cudne znaky aj samotny text na stranke, ktory nema nic spolocneho s databazou...
musis mat vsade rovnake kodovanie
_________________ NTB: Acer Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB | RAM: 8GB DDR3 1066 MHz | HDD: 1TB SSD WD BLUE |
|
Registrovaný: 07.08.06 Prihlásený: 18.11.21 Príspevky: 947 Témy: 268 Bydlisko: Levice | Napísal autor témy neopagan: 17.03.2008 20:58 | |
|
jaji: no localhost je u teba, to ide.. ale server maju asi nastaveny tak, aby nerobil ukony trvajuce dlhsie ako 5s... kvoli zatazi servera... nevadi...
stenley: nastavil som kodovanie iso-8859-2 v head na stranke, aj som stranku ulozil v tomto kodovani, polia a tabulku databazy som tiez tak zmenil na latin2_general_ci, ale stale to nefunguje... tak isto ako predtym... uz mi sice nehadze otazniky a blbosti, znaky zobrazuje v poho, ale nevyhladava vsetko-tak ako doteraz...
Jediny problem by som videl v tomto: v phpadmin neviem zmenit kodovanie pre celu databazu - je to takto: Znaková sada v MySQL: UTF-8 Unicode (utf8) a toto sa tu neda absolutne zmenit...
Ale nevadi, problem, ktory trva viac ako 3 dni znamena pre mna to, ze to necham tak a vyriesim to inym sposobom - tym prvym diakritickym sposobom. Kaslat na to, ze nebude vyznacene hladane slovo, hlavne ze najde ten text...
|
|
| Stránka: 1 z 1
| [ Príspevkov: 22 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|