匹配包含嵌套HTML的术语

时间:2013-02-21 19:35:20

标签: c#

我一直无法找到解决这个问题的方法 我正在解析许多电子书的内容,找到特定的术语和字符,标记每个术语的位置和长度。

正常情况就是这样(摘自权力的游戏):

  “当他停下来俯视时,他的脑袋头晕目眩,他感觉到他的手指在滑动.Bran哭了出来,紧紧抓住了生命。”

如果我们要搜索字符“Bran”,它的位置是85,长度是4.很容易。

如果有这样的段落,我的问题就出现了:

<span height="-0em"><font size="7">D</font></span>aenerys Targaryen wed Khal Drogo

我们需要匹配“Daenerys Targaryn”。剥离HTML并匹配字符串很容易,但在此示例中,结果需要包含HTML。因此,预期结果将是位置= 0,长度= 67。

由随机锚标签引起的另一种情况:

Did anyone outside the Vale even suspect where Catelyn <a></a>Stark had taken him?

再次,搜索“Catelyn Stark”需要包含HTML,所以location = 47,length = 20.

我已经能够通过添加这些特定情况暂时绕过它(特别是搜索“Catelyn&lt; a&gt;&lt; / a&gt; Stark”),但显然我应该有一个更强大的解决方案,我似乎无法让我的头脑。我的尝试一直在使用RegEx,但成效有限 我发现了有关HTML匹配/剥离(以及是否使用RegEx =)的各种问题,但这种情况似乎有点独特。
剥离标签不是一种选择,因为必须保留内容 这是一个独立的C#应用​​程序 任何想法,正确方向的步骤或类似的例子,如果您的搜索比我的更好,我们将不胜感激!

3 个答案:

答案 0 :(得分:3)

一种可能的方法是在搜索字符串中的每个字母之间插入以下内容:

(?:<[^>]*>)*

因此,当搜索字符“Bran”时,你的正则表达式会变成以下内容:

(?:<[^>]*>)*B(?:<[^>]*>)*r(?:<[^>]*>)*a(?:<[^>]*>)*n

这将允许您的正则表达式匹配搜索字符串中任意位置的任意数量的HTML标记。请注意,这只有在搜索字符串总是像字符名称一样简单而不是正则表达式时才会起作用(如果搜索字符串中有a*重复,此方法将失败。)

答案 1 :(得分:1)

我会创建一个函数,将“Daenerys Targaryn”作为参数,然后删除第一个字母。然后,它只搜索“aenerys Targaryn”,如果找到,它将搜索“&gt; D&lt;”或第一个可变字母。有意义吗?

示例:

public static string searchFor(string str)
{
  // strip first letter of search string (in this case "D")
  // search for the rest of the string ("aenerys Targaryn")
  // if found, search for ">D<"
  // if found, search for HTML tags with "D" inside (using regex)
  // if found, search for HTML tags with the previous HTML tag in them (using regex)
  return result;
}

答案 2 :(得分:0)

使用Javascript或Php,您可以获取元素文本和文档文本并在那里搜索,然后执行正则表达式以返回最接近的匹配项(包含html):

另一种选择:

<小时/> 将使用Lucene搜索引擎(这恰好让你以不同的格式(html格式就是其中之一)进行索引来对书籍进行索引。

然后,您可以使用Lucene api更轻松地搜索文档。 在php中我们有Zend_Search_Lucene,它可以完美地用于此类事情。

<小时/> Lucene搜索可在以下位置找到: http://lucene.apache.org/core/

玩得开心!