Oznaczenie w prosty sposób wszystkich szukanych słów w przeszukiwanym stringu.

0

Chciałbym każde szukane słowo w tekście otoczyć znacznikami <mark> i <\mark>. Do tej pory wyszukiwałem i oznaczałem cały szukany string z użyciem wyrażenia regularnego:

Kod w JavaScript:
text.replace(new RegExp("(" + searchString + ")", 'gi'), "<mark>$1</mark>");

Teraz chcę podzielić szukany string na słowa i oznaczyć każde słowo osobno. Czy jest jakiś znany algorytm, który rozwiązuje taki problem? Nie chcę wykonywać dokładnie tego samego, co wyżej, dla każdego słowa po kolei, bo taka operacja mogłaby zamienić też znaczniki <mark> i </mark> z zaznaczania poprzednich słów.

Nie interesuje mnie kod w konkretnym języku, tylko sposób rozwiązania problemu. Myślałem o tym, żeby najpierw wyszukać każde słowo po kolei i zapamiętać ich pozycje w przeszukiwanym tekście, a na końcu wstawiać znaczniki, ale mogłoby się namieszać w przypadku, gdy końcówka jednego słowa jest taka sama, jak początek któregoś kolejnego lub początek jest taki sam, jak końcówka któregoś kolejnego. Mogę też ignorować wszystkie pozycje, które zaczynają się lub kończą po jakiejś znalezionej już pozycji i przed tą pozycją z dodaną ilością znaków szukanego słowa, ale poziom skomplikowania w takim przypadku wzrasta.

0

Bardzo proste rozwiązanie przyszło mi do głowy, gdy pomyślałem o użyciu rekurencji.

function mark(text, words)
{
    if (words.length > 0)
    {
        var splitedText = text.split(words[0]);
        for (var i = 0; i < splitedText.length; i++)
            splitedText[i] = mark(splitedText[i], words.slice(1, words.length));
        return splitedText.join('<mark>' + words[0] + '</mark>');
    }
    else
        return text;
}

Dzielę przeszukiwany tekst na fragmenty oddzielone jednym z szukanych wyrazów i łączę ponownie te fragmenty tym samym słowem z dodanymi znacznikami po wyszukaniu w tych fragmentach wszystkich szukanych słów występujących po obecnie szukanym.

Myślałem, że jeśli będę miał szukane słowa, które mają część wspólną, np. "monitor" i "tort", to uda mi się oznaczyć całe słowo "monitort", ale niestety tą metodą tego nie osiągnę. Drugi minus to brak ignorowania wielkości liter, ale mam nadzieję, że sobie z tym poradzę zamieniając funkcje split i join na własne, jeśli split będzie dodatkowo zwracał słowa, którymi podzielił tekst, a join będzie używał tych słów do łączenia fragmentów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1