在字符串中的某些单词周围注入HTML标记

1 html c# regex

说我有这两个字符串:"有些文字在这里"和"有些文字在这里"

我有一个集合,其中包含我想要与字符串中的文本匹配的单词."一些","文字","这里"

如果其中一个单词与字符串中的某个单词匹配(无论是大写还是小写),我想从字符串中取出原始单词并在其周围添加一些HTML标记<dfn title="Definition of word">Original word</dfn>.

我正在玩string.Replace()方法,但不知道如何让它匹配,无论案例如何仍然保持原始单词完整(因此我不用"word"代替" <dfn title="">Word</dfn反之亦然").

Nol*_*rin 5

实际上,string.Replace在这种情况下,该方法的通用性不足以满足您的要求.低级文本操作应该完成这项工作.替代方案当然是正则表达式,但我在这里提出的算法将是最有效的方法,我认为无论如何编写它将有助于了解如何在没有正则表达式的情况下进行大量文本操作以进行更改.

这是功能.

更新:

  1. 现在使用a Dictionary<string, string>而不是a string[],它可以将定义与单词一起传递给函数.
  2. 现在使用定义字典的任意排序.

...

public static string HtmlReplace(string value, Dictionary<string, string>
    definitions, Func<string, string, string> htmlWrapper)
{
    var sb = new StringBuilder(value.Length);

    int index = -1;
    int lastEndIndex = 0;
    KeyValuePair<string, string> def;
    while ((index = IndexOf(value, definitions, lastEndIndex,
        StringComparison.InvariantCultureIgnoreCase, out def)) != -1)
    {
        sb.Append(value.Substring(lastEndIndex, index - lastEndIndex));
        sb.Append(htmlWrapper(def.Key, def.Value));
        lastEndIndex = index + def.Key.Length;
    }
    sb.Append(value.Substring(lastEndIndex, value.Length - lastEndIndex));

    return sb.ToString();
}

private static int IndexOf(string text, Dictionary<string, string> values, int startIndex,
    StringComparison comparisonType, out KeyValuePair<string, string> foundEntry)
{
    var minEntry = default(KeyValuePair<string, string>);
    int minIndex = -1;
    int index;
    foreach (var entry in values)
    {
        if (((index = text.IndexOf(entry.Key, startIndex, comparisonType)) < minIndex
            && index != -1) || minIndex == -1)
        {
            minIndex = index;
            minEntry = entry;
        }
    }

    foundEntry = minEntry;
    return minIndex;
}
Run Code Online (Sandbox Code Playgroud)

还有一个小测试程序.(为方便起见,请注意使用lambda表达式.)

static void Main(string[] args)
{
    var str = "Definition foo; Definition bar; Definition baz";
    var definitions = new Dictionary<string, string>();
    definitions.Add("foo", "Definition 1");
    definitions.Add("bar", "Definition 2");
    definitions.Add("baz", "Definition 3");
    var output = HtmlReplace(str, definitions,
        (word, definition) => string.Format("<dfn title=\"{1}\">{0}</dfn>", 
            word, definition));
}
Run Code Online (Sandbox Code Playgroud)

输出文字:

定义<dfn title ="定义1"> foo </ dfn>; 定义<dfn title ="定义2">栏</ dfn>; 定义<dfn title ="定义3"> baz </ dfn>

希望有所帮助.