Muszę wyróżnić wyszukiwane hasła w bloku tekstu.

Moja pierwsza myśl była zapętlona podczas wyszukiwanych haseł. Ale czy jest prostszy sposób?

Oto, o czym myślę, używając pętli...

public string HighlightText(string inputText)
{
    string[] sessionPhrases = (string[])Session["KeywordPhrase"];
    string description = inputText;

    foreach (string field in sessionPhrases)
    {
        Regex expression = new Regex(field, RegexOptions.IgnoreCase);
        description = expression.Replace(description, 
                                         new MatchEvaluator(ReplaceKeywords));
    }
    return description;
}

public string ReplaceKeywords(Match m)
{
    return "<span style='color:red;'>" + m.Value + "</span>";
}
1
user713813 15 luty 2012, 09:29

2 odpowiedzi

Najlepsza odpowiedź

Możesz zastąpić pętlę czymś w rodzaju:

string[] phrases = ...
var re = String.Join("|", phrases.Select(s => Regex.Escape(s)).ToArray());
text = Regex.Replace(re, text, new MatchEvaluator(SomeFunction), RegexOptions.IgnoreCase);
1
Qtax 15 luty 2012, 10:33

Rozszerzenie odpowiedzi Qtax:

phrases = ...

// Use Regex.Escape to prevent ., (, * and other special characters to break the search
string re = String.Join("|", phrases.Select(s => Regex.Escape(s)).ToArray());

// Use \b (expression) \b to ensure you're only matching whole words, not partial words
re = @"\b(?:" +re + @")\b"

// use a simple replacement pattern instead of a MatchEvaluator
string replacement = "<span style='color:red;'>$0</span>";
text = Regex.Replace(re, text, replacement, RegexOptions.IgnoreCase);

Nie znaczy to, że jeśli już zastępujesz dane w HTML, może nie być dobrym pomysłem użycie Regex do zastąpienia czegokolwiek w treści, możesz w końcu otrzymać:

<<span style='color:red;'>script</span>> 

Jeśli ktoś szuka terminu skrypt.

Aby temu zapobiec, możesz użyć HTML Agility Pack w połączeniu z Wyrażenie regularne.

Możesz chcę również sprawdzić ten post, który dotyczy bardzo podobnego problemu.

0
Community 23 maj 2017, 14:58