[ Dejan Topalovic @ 07.08.2003. 19:01 ] @
Trenutno pisem neku skriptu za pretragu baze sa podacima. Uradio sam to na dva nacina - prvo da se pretraga vrsi sa fulltext searchom, a ako ne nadje nista, onda da se pretraga vrsi sa klasicnim nacinom LIKE .
Kao rezultat ispisujem samo naslov odredjenog artikla, koji je ujedno i link za detaljnije informacije o tom artiklu.
Medjutim, zelio bih da kao rezultat pretrage osim naslova prikazem i dio opisa tog artikla, sa highlightovanim search pojmom. To mogu da uradim sa slijedecim jednostavnim nacinom:
Code:

$zamjena = '<span style="background-color: #FF9966">$1</span>';
$artikl_opis = preg_replace("/(\b".$trazi."\b)/imsu",$zamjena,$artikl_opis);


E sad, zelio bih recimo da ispisem 50 znakova iz opisa, pa onda highlightovani search pojam, pa onda opet 50 znakova iza toga.

Pokusao sam neke preg_replace patterne, ali nisam imao uspjeha. Citanje PHP manuala mi nije dalo puno pomoci ili zbog vrucine nisam u stanju da se dovoljno koncentrisem.
Da li neko ima rjesenje ?
[ leka @ 07.08.2003. 20:51 ] @
Imenjace, cim sam video ovaj tekst odmah se setih jednog davnog tutorijala na Zend-u: http://www.zend.com/zend/tut/tutorial-ferrara1.php ... Ako ne pomogne, onda cemo videti dalje...
[ Dejan Topalovic @ 08.08.2003. 01:33 ] @
Imenjace, hvala na linku. Vrlo je poucan, ali nazalost nema ono sta meni treba.

Fulltext search sam savladao i sve radi kako treba kad ne moram da prikazujem 50 znakova (ili koliko vec ima) prije trazenog pojma, zatim trazeni pojam, pa na kraju slijedecih 50 znakova (ili koliko ih je vec ostalo) u zadanom stringu. Ako mi preg_replace vraca back reference u obliku:

tekst prije trazenog pojma = $1 ili \\1
trazeni pojam = $2 ili \\2
tekst nakon trazenog pojma = $3 ili \\3

ja zelim da ih obradim na nacin:
substr($1,0,50)."<span class=\"background-color: #FFFF00; color: #000000\">".$2."</span>".substr($3,0,50)

Pokusavao sam neke nacine sa substring, ali ne ide. Dakle, treba mi samo odgovarajuci regexp za to.
Ako neko zna, bio bih mu vrlo zahvalan.

Nastavljam dalje da trazim rjesenje...

PS: Nasao sam neke korisne linkove za highlight trazenih pojama, pa ako mogu nekome biti od koristi, evo ih:
http://blogs.linux.ie/xeer/archives/p/89490286/c/1
http://www.textism.com/tools/google_hilite/
[ Jbyn4e @ 08.08.2003. 10:41 ] @
Jedino sto mi trenutno pada na pamet je da (pretpostavljam da ti nadjes ceo opis i stavis ga u promenljivu - znaci select opis from tabela where uslov ide u recimo promenljivu $a) podelis promenljivu $a na jedan veliki niz:
$b= explode ($a, " ");
zatim da nadjes velicinu niza (strlenght valjda to bese radi), da pronadjes u kom elementu niza (recimo stavis ga u promenljivu $gde) se nalazi trazena rec (ako je rec u pitanju, ako je izraz to vec komplikuje situaciju), i da uradis jednu for petlju od $gde-50 do $gde+50 i ispises te reci (i dodas space-ove izmedju)

Ovo je mozda "malo" ruzno resenje, ali samo to mi sad pada na pamet.
[ -zombie- @ 08.08.2003. 13:12 ] @
probaj ovo:

Code:

$text="bla bla i truc i opet ja vama zelim da vi lepo porastete i da se posle 
lepo igrate i sta ti ja znam vise, ali ja znam da vi opet volite svoju zemlju".
$rec="vi";

preg_match_all("~(.{0,5}) ($rec) (.{0,5})~is", $text, $a);
foreach ($a[0] as $r) {
    echo preg_replace("~$rec~iUs", "<b>$0</b>", $r)."<p>";
}


(ovo prikazuje po 5 karaktera sa strane.. nadam se da znaš da prepraviš na 50 ;)
[ Dejan Topalovic @ 08.08.2003. 22:18 ] @
-zombie- da, preg_match_all sam zaboravio upotrijebiti. Hvala na savjetu.

Uspio sam nekako srediti da mi to radi sa plain textom i radice u vecini slucajeva.
Medjutim, kad za taj opis koristim i HTML tagove za podebljavanje teksta ili neki drugi tag, desi se da mi tih 50 znakova zahvati i te tagove, pa se onda prikaz rezultata pretrage malo poremeti.
Sad cu pokusati da sredim nekako da u pretrazi ignorira HTML tagove i njihove atribute. Vjerovatno ce strip_tags tu uletiti u igru.

Rjesenje cu naravno objaviti ovdje :) (Ako ga nadjem :( :) )