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...