fulltextové vyhledávání v Mysql v html textu

12 příspěvků

Archiv diskusního fóra

Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.

  1. 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
  2. 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.
  3. 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.
  4. pokud to máš napsané, takhle, tak ti to ze vzorku <span>cosi</span>, podle mě vybere "span>cosi</span"
  5. ^[^<].*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
  6. 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?
  7. 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.
  8. ..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á...
  9. 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
  10. 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...
  11. Ale jak to zkombinovat s ereg_Replace nebo Str_Replace ?
  12. zkus něco ve smyslu eregi_replace("([^\>]*)($vyraz)([^\<]*)","\\1<b>\\2</b>\\3",$text) ale netestoval jsem to, protože nebyl čas...

← Zpět na všechna témata