Försöker klura ut en vettig algoritm för att markera och ta ut de 3-4 första meningarna runt mina sökord (likt google). Är det någon som gjort/sett detta förut? Hej Lite mer kod: Jag lyckas få med all text med det regex utrycket.Highlight algoritm
Den koden jag har nu gör inte specielt mycket, den markerar bara sökorden...
<code>
foreach(string str in Query.Split(' '))
{
q += str +"|";
}
q = q.Substring(0,q.Length-1);
TextToHighLight = Regex.Replace(TextToHighLight, q, "<b>$&</b>", RegexOptions.IgnoreCase);
</code>Sv: Highlight algoritm
Du menar 3-4 ord runt ditt sökord?
Knådade ihop ett reguljärt uttryck som fixar det (endast en grund).
Observera att du får modifiera den, det tar bara ord separerade med mellanslag.
Ändra 2 och 3 till de antal "ord" du vill ha till vänster resp. höger om sökordet "test".
<code>
.*?(^| )(([^ ]+?[ ]){0,2}test([ ][^ ]+?){0,3})($| ).*
</code>
Grupp 2 innehåller resultatsträngen.
Sedan kan du fet-markera sökordet med ytterligare ett reguljärt yttryck liknande det du redan använt dig av.
/ PeterSv: Highlight algoritm
Men det är segt...och kan man på nått sätt göra så man känner av mellanslad, punkt, komma osv, så man inte bryter mitt i ord.
<code>
private string HighLight(string TextToHighLight, string Query)
{
string q = "";
string result;
string KeyWord = "[KEYWORD]";
int Index;
foreach(string str in Query.Split(' '))
{
q += str +"|";
}
q = q.Substring(0,q.Length-1);
TextToHighLight = Regex.Replace(TextToHighLight, q, KeyWord+"<b>$&</b>", RegexOptions.IgnoreCase);
Index = TextToHighLight.IndexOf(KeyWord, 0, TextToHighLight.Length);
result = HighlightSelect(0,TextToHighLight,Query);
return result;
}
private string HighlightSelect(int Start, string Text, string Query)
{
string KeyWord= "[KEYWORD]";
string SubString;
StringBuilder ReturnString = new StringBuilder();
int Index;
while(ReturnString.Length < 300)
{
Index = Text.IndexOf(KeyWord, Start, Text.Length - Start);
if(Index > 0)
{
SubString = Text.Substring(System.Math.Max(Index-45, 0), System.Math.Min(Text.Length - Index, 90));
if(ReturnString.Length == 0)
ReturnString.Append(Index+" "+SubString.Replace(KeyWord,""));
else
ReturnString.Append("..."+ Index+" "+SubString.Replace(KeyWord,""));
Start = Index + 1;
}
else
break;
}
return ReturnString.ToString();
}
</code>Sv:Highlight algoritm
koden
<code>
private string HighLight(string TextToHighLight, string Query)
{
string q = "";
string pattern = "";
string result = "";
foreach(string str in Query.Split(' '))
{
if(pattern.Length == 0)
pattern += ".*?(^| )(([^ ]+?[ ]){0,2}"+ str +"([ ][^ ]+?){0,3})($| ).*";
else
pattern += "|.*?(^| )(([^ ]+?[ ]){0,2}"+ str +"([ ][^ ]+?){0,3})($| ).*";
}
Regex reg = new Regex(pattern);
MatchCollection matches = reg.Matches(TextToHighLight);
foreach(Match m in matches)
{
if(result.Length == 0)
result = m.Value;
else
result += "..."+ m.Value;
if (result.Length > 200)
break;
}
foreach(string str in Query.Split(' '))
{
q += str +"|";
}
q = q.Substring(0,q.Length-1);
result = Regex.Replace(result, q, "<b>$&</b>", RegexOptions.IgnoreCase);
return result;
}
</code>
m.Value blir hela stycket text som skickas med TextToHighLight.