Zdravím, pořeboval bych poradit s následujícím příkladem.
1.)Načítám příspěvky z MYSQL s html formátováním a vkládám je pomocí echa do stránky.
2.)Když chci zobrazit výsledky fulltextové vyhledávání v Mysql chtěl bych obarvit klíčová slova např žlutě. Pokud použiji  Str_Replace s tím, že původní klíčové slovo obalím tagem span se stylem barvy, někdy se stane, že se zkazí formátování tam, kde bylo klíčové slovo součástí samotného jiného tagu např. v title, alt atd.
Chtěl bych to vyřešit regulárními výrazy, ale nepřišel jsem jak na to.
mělo by to být něco jako : najdi výraz $x, ale který 
nezačíná znaky: < + libovolné znaky 
a  nekonci znaky:  libovolné znaky >
Napadlo me neco podobného jako:
^[^<].*sauny.*[^>]$
nebo
^[^<].*^sauny$.*[^>]$
ale nefunguje mi nic co jsem vymyslel, možná chci po reg. výrazech moc a kombinuji vyber s negaci, což je třeba problém.
Prosím poraďte jak na obarvení výsledků v textu jakýmkoliv způsobem.
Zajímalo by mně také, zda jde nějak obejít ve fulltextu v databázi, aby fulltext nereagoval na klíčová slova obsažená mezi symboly <>.
Předem díky za každou radu.
Pavel
                                 
                                 
                               
               
                              
                                 
                                      nevím jak s fulltext vyhledáváním v SQL, (ale tam se dá nějaká obcházení tagů asi taky řešit reg. výrazy, nevím nedělal jsem to) ale u klasických reg. výrazů se musí počítat s tzv. maximalizmem, tzn. podle výrazu vybere co největší vzorek. Takže pokud tam máš .* tak můžeš pomalu počítat s tím, že to vybere o moc větší vzorek než chceš. Možná by bylo dobré výběr omezit na  nebílé znaky (tuším \S), to jsou mezery, entey, tabulátory, nebo slova (tuším \w) a podobné vymyšlenosti. Chce to asi pročíst definice reg. výrazů a trochu experimentovat.
                                 
                                 
                               
               
                              
                                 
                                      Dík
Omezení právě mělo být znakem na začátku < a na konci >, takže by výběr neměl být tak velký.
Podle mě to mám špatně napsáno a zkombinováno.
                                 
                                 
                               
               
                              
                                 
                                      pokud to máš napsané, takhle, tak ti to ze vzorku
<span>cosi</span>, podle mě vybere "span>cosi</span"
                                 
                                 
                               
               
                              
                                 
                                      ^[^<].*sauny.*[^>]$  to by nemělo, protože střižka v závorce neguje výběr, tzn., že by to mělo vybrat řetězec nezačíná a nekončí <>
je to asi celé nesmysl, protože v tom případě mi to může vybrat celý odstavec v kterém je obsaženo sauna.
Musí to jít jinak.
Nevíte někdo  nějaké jiné řešení?
Díky předem
                                 
                                 
                               
               
                              
                                 
                                      Jeste me napadlo tohle: 
 rosekat kod na casti s tagama a na bez tagů a pak vybrat ty části bez tagů,  ty obarvit a zase to poskládat dohromady. Ale to zpomalí nacítání ne?
                                 
                                 
                               
               
                              
                                 
                                      Zasel jsi ve mě semínko pochybnosti, tak jsem to zkusil a je to přesně tak jak sem psal. Ještě je tam jedna drobnost. Pokud napíšeš: ^[^<] a řetězec náhodou začíná <, tak se ti nic nevybere.
Uf, jak to řešit. Potřebuješ vybrat výskyt slova 'sauna' tak, aby nebyl v tagu, jo?
mám třeba takovýto řetězec:
<hah>cosi</hah>flakj <a class="a cosi b">sdlfjas<br/>
a chci najít "cosi"
uf, pomalu nabývám dojmu, že to reg. výrazem nepůjde. Aspoň ne to co jsem uvedl jako příklad. Možná se mýlím.
Tohle jedině prohledat "ručně" a držet si informaci o tom, jestli jsem v tagu nebo ne.
Aspoň obecně. Kdybys měl jasný formát, třeba, že se tam vyskytuje max. <br/> nebo <a ...> tak by se to dalo řešit i reg. výrazem.
Možná by to šlo na vícekrát. Teda, jestli chceš to "cosi" zvýraznit, talo by se  to udělt takto:
 # tohle je vzorovy vstup
 $r = "<hah>cosi</hah>flakj <a class=\"a cosi b\">sdlfjas<br/>";
 # tohle je to, co hledam
 $h = "cosi";
 $r1 = preg_replace("/($h)/", "|#$1#|", $r);
 $r2 = preg_replace("/(<[^>]*)(\|\#$h\#\|)/", "$1$h", $r1);
 $r3 = preg_replace("/\|\#/", "<b>", $r2);
 $r4 = preg_replace("/\#\|/", "</b>", $r3);
 # testovaci tisky
 echo "p $r<br/>\n";
 echo "1 $r1<br/>\n";
 echo "2 $r2<br/>\n";
 echo "3 $r3<br/>\n";
 echo "4 $r4<br/>\n";
je to příkald, dá se to udělat do jedné proměnné, možná to půjde i zjednodušit, nic méně to funguje. Ty sekvence |# a #| si pochopitelně můžeš vymyslet jak budeš potřebovat.
                                 
                                 
                               
               
                              
                                 
                                      ..možná je to zbytečně složité.
stačilo by zjistit jestli tam ty tagy jsou  a když ne tak k hledanému slovu přidat  zvýraznění.
preg_replace("/hledane/", "<b>hledane</b>", $r);
Když jo tak zvyraznění přidat jenom takto
preg_replace("/(>[^<]*)hledane/", "$1<b>hledane</b>", $r);
takhle by to bylo jednodušší.
Místo hledane se da dat proměnná...
                                 
                                 
                               
               
                              
                                 
                                      Díky moc zkusím to. Ještě tam je jeden problém a to že hedaný řetězec může být obalen něčím dalším a to jak mimo tag, tak i v tagu
mimo tag <b> něco něco hledane něco něco</b> 
a třeba v tagu <img src ... title="neco hledane neco ">
což je zase o něco složitější.
Vyzkouším tvý rady a dám vědět, díky
                                 
                                 
                               
               
                              
                                 
                                      a co zjistit, jestli se před slovem nachází tag < ale nenachází tad >? 
jestli jo tak se nic nestane a jestli ne, tak se obarví...
 je to jen návrch...
                                 
                                 
                               
               
                              
                                 
                                      Ale jak to zkombinovat s ereg_Replace nebo Str_Replace ?
                                 
                                 
                               
               
                              
                                 
                                      zkus něco ve smyslu 
eregi_replace("([^\>]*)($vyraz)([^\<]*)","\\1<b>\\2</b>\\3",$text)
ale netestoval jsem to, protože nebyl čas...