Я имею, создают litte форму asp.net, которая ищет что-то и отображает результаты. Я хочу выделить строку поиска в результатах поиска. Пример:
Query: "p"
Results: a<b>p</b>ple, banana, <b>p</b>lum
Код, который я имею, идет как это:
public static string HighlightSubstring(string text, string substring)
{
var index = text.IndexOf(substring, StringComparison.CurrentCultureIgnoreCase);
if(index == -1) return HttpUtility.HtmlEncode(text);
string p0, p1, p2;
text.SplitAt(index, index + substring.Length, out p0, out p1, out p2);
return HttpUtility.HtmlEncode(p0) + "<b>" + HttpUtility.HtmlEncode(p1) + "</b>" + HttpUtility.HtmlEncode(p2);
}
Я главным образом работаю, но попробуйте его, например, HighlightSubstring("ß", "ss")
. Это отказывает, потому что в Германии "ß" и "ss" считаются равными IndexOf
метод, но у них есть другая длина!
Теперь, когда был бы в порядке, если бы был способ узнать, какой длины соответствие в "тексте". Помните, что эта длина может быть != substring.Length
.
Таким образом, как я узнаю продолжительность соответствия это IndexOf
производит в присутствии лигатур и экзотических символов языка (лигатуры в этом случае)?
Это может не дать прямого ответа на ваш вопрос, но, возможно, решит вашу проблему.
Почему бы не подставить вместо?
using System.Text.RegularExpressions;
public static string HighlightString(string text, string substring)
{
Regex r = new Regex(Regex.Escape(HttpUtility.HtmlEncode(substring)),
RegexOptions.IgnoreCase);
return r.Replace(HttpUtility.HtmlEncode(text), @"<b>$&</b>");
}
Но что насчет культуры? Если вы указываете Regex как нечувствительный к регистру, он по умолчанию чувствителен к культуре, согласно http://msdn.microsoft.com/en-us/library/z0sbec17.aspx.