4

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

一个正常的情况是这样的(摘自《权力的游戏》):

“当他停下来往下看时,他头晕目眩,手指在滑落。布兰大叫着,紧紧抓住生命。”

如果我们搜索字符“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 <a></a>Stark),我已经能够暂时解决它,但显然我应该有一个更强大的解决方案,我似乎无法理解。我的尝试一直在使用 RegEx,但成功有限。
我发现了有关 HTML 匹配/剥离(以及是否使用 RegEx =))的各种问题,但这种情况似乎有些独特。
剥离标签不是一种选择因为必须保留内容。
这是在独立的 C# 应用程序中。
如果您的搜索比我的更好,任何想法、正确方向的步骤或类似示例将不胜感激!

4

3 回答 3

3

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

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

因此,在搜索字符“Bran”时,您的正则表达式将变为以下内容:

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

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

于 2013-02-21T19:45:31.747 回答
1

我将创建一个将“Daenerys Targaryn”作为参数的函数,然后去掉第一个字母。然后,它只会搜索“aenerys Targaryn”,如果找到,它会搜索“>D<”或第一个变量字母。比有意义吗?

例子:

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;
}
于 2013-02-21T20:01:15.640 回答
0

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

另外一个选项:


将首先使用诸如 Lucene 搜索引擎之类的东西来索引书籍(它恰好可以让您以不同的格式进行索引(html 格式就是其中之一)。

然后,您可以使用 Lucene api 更轻松地搜索您的文档。在 php 中,我们有Zend_Search_Lucene非常适合这种事情。


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

玩得开心!

于 2013-02-21T19:44:50.940 回答