0

嗨,我正在寻找清理标签或至少从文本中的自定义标签中获取数据的最佳实践或想法。

我确信我可以编写某种“解析器”,它会手动遍历每一行,但今天不是有一些更聪明的方法吗?

数据思路:

{电话:555-123456789}

在这里,我们将“电话”作为键,将数字作为数据。看起来很像 JSON 格式,但它更容易为人类编写。

或者

{link:   article123456  ;    title:    Read about article 123456 here   } 

也可以是普通的 (X)HTML:

<a         href="article123456.html"      >  Read about article 123456 here  </a>

人类并不总是很好地“修剪”他们的输入,也不是用懒惰的所见即所得编辑器制作的旧网站,所以我首先需要弄清楚哪些对属于一起,然后在找到“内部数据”之后修剪结果。

问题出在上面的“标题”部分,标题文本周围没有“”,因此它可以自动添加它们或向人类显示错误。

关于如何以最佳方式获取这些数据的任何想法?似乎有几种方法可能有效,但您解决这个问题的最佳方法是什么?

4

1 回答 1

2

我会首先为我正在解析的数据的语法编写一个“标记器”。标记器是一个(相对)简单的过程,它将字符串分解为一系列片段或标记。例如,在前两种情况下,您的基本标记将包括:“{”、“}”、“:”、“;”,其他所有内容都将被解释为数据标记。这可以通过循环、递归函数或许多其他方式来完成。标记您的第二个示例将生成具有以下值的数组(或某种其他类型的列表):

"{", "link", ":", "   article123456  ", ";", "    title", ":", "    Read about article 123456 here   ", "}"

下一步将是“清理”您的数据,尽管在这些情况下,真正意味着删除不需要的空白。遍历生成的令牌数组,并更改每个令牌,以便没有开始或结束空格。这一步可以与标记化结合起来,但我认为分开做会更清晰、更清晰。您的令牌将如下所示:

"{", "link", ":", "article123456", ";", "title", ":", "Read about article 123456 here", "}"

最后是实际的“解释”。您需要将令牌数组转换为您打算成为解析过程最终产品的任何类型的实际数据结构。为此,您肯定需要一个递归函数。如果函数在数据标记上调用,然后是冒号标记,然后是数据标记,它将在键值对中解释它们,并相应地生成数据结构。如果在一系列带有分号标记的标记上调用它,它将在每个分号处拆分标记并在每个结果组上调用自身。如果它被包含在大括号标记中的标记上调用,它会在执行任何其他操作之前在包含的标记上调用自己。请注意,这不一定是您要检查这些不同情况的顺序;尤其是,

这些过程的结果将是您想要的任何类型的完全解析的数据结构。请记住,此过程假定您的数据全部隐式存储为字符串类型;如果您希望对“3”和 3 进行不同的解释,那么事情会变得更复杂一些。我概述的这种方法根本不是唯一的方法,但它是我解决问题的方法。

于 2010-06-20T15:14:40.073 回答