【问题标题】:Is it possible to remove tags (or sequences) and relate or remember them as indexes?是否可以删除标签(或序列)并将它们关联或记忆为索引?
【发布时间】:2017-03-21 08:41:34
【问题描述】:

我正在处理 HTML 标记,我需要解释 HTML 文档。这是我需要实现的目标:

  • 我必须识别并删除 HTML 标签而不删除 原创内容。
  • 我必须存储以前存在的标记的索引。

所以这里有一个例子。假设我有以下标记:

This <strong>is a</strong> message.

在本例中,我们有一个包含 35 个字符的字符串序列,并使用strong 标签进行标记。众所周知,HTML 标记有开始和结束,如果我们将开始和结束标记解释为一系列字符,则每个标记也都有开始和结束(字符索引)。

同样,在前面的示例中,打开/开始标签的开始索引是 5(从索引 0 开始),结束索引是 13。同样的逻辑也适用于结束标签。

现在,一旦我们删除标记,我们就会得到以下结果:

This is a message.

问题:

我如何通过这个序列记住可以再次输入标记的位置?

例如,一旦标记被删除,我怎么知道我必须在 X 位置/索引中插入开始标签,在 Y 位置/索引中插入结束标签......就像这样:

This is a message.
     5   9
index 5 = <strong>
index 9 = </strong>

我必须记住,有可能找到以下情况:

<a>T<b attribute="value">h<c>i<d>s</a> <g>i<h>s</h></g> </b>a</c> <e>t</e>e<f>s</d>t</f>.

我需要在 Java 中实现这个。我已经弄清楚如何获取文档中每个标签的开始和结束索引。为此,我正在使用正则表达式(模式和匹配器),但我仍然不知道如何正确地再次插入标签(如所述)。我想要一个工作示例(如果可能的话)。它不必是世界上最好的例子(最好的解决方案),只要它在任何情况下都能以正确的方式工作

如果有人不明白我的问题,请评论说我会做得更好。

提前致谢。

编辑

cmets 中的人说我不应该使用正则表达式来处理 HTML。我不在乎使用或不使用正则表达式来解决这个问题,我只想解决它,无论如何(但当然,以最合适的方式)。

我提到我正在使用正则表达式,但我不介意使用提供相同解决方案的另一种方法。我读到 XML 解析器可能是解决方案。那是对的吗?是否有一个 XML 解析器能够完成我需要的所有这些工作?

再次感谢您。

编辑 2

我现在做这个版本是为了解释我的问题的适用性(按要求)。好吧,在我开始之前,我想说我正在尝试做的事情是我以前从未做过的事情,这不是我所在领域的事情,所以它可能不是最合适的方式。总之……

我正在开发一个网站,允许用户阅读内容但不能对其进行编辑(编辑或删除文本)。但是,用户仍然可以标记/突出显示当前内容的摘录(范围)(带有一些风格化)。这是重要的摘要

现在问题是如何做到这一点(在 Java 中)。在客户端,目前,我正在考虑使用TinyMCE 来启用内容样式而不需要文本编辑。我可以将程式化的文本保存到数据库中,但这会占用大量空间,因为每个客户都可以这样做,因为他们有很多客户。因此,如果客户端标记了一个段落的 sn-ps,则为系统中的每个客户端将段落保存回数据库中在内存方面有点昂贵。

所以我想只将用户所做的标记的范围(索引)保存在数据库中。只保存几个数字比保存所需样式的所有文本要容易得多。例如,在这种情况下,我可以在表格中保存一行/记录:

  • 在 X 段落中,从 Y 到 Z 索引,用户 P 定义了一个 ABC 风格化。

这将需要从数据库到 HTML 以及从 HTML 到数据库的翻译/转换。设置转换器可能很容易(我猜),但我不知道如何获取索引(遵循这个逻辑)。然后我们在我的问题开始时再次停止。


只是为了说清楚:

如果有人提供需要花钱的解决方案,例如付费 API、工具或类似的东西,很遗憾,这个选项对我来说不可行。对不起:/

以类似的方式,我知道使用 JavaScript(客户端)进行此处理是理想的。事实证明,我没有专门的 JavaScript 团队,所以这需要在服务器端完成(不幸的是),它是用 Java 编写的。如果 JavaScript 解决方案已经准备好、易于使用且使用快速,我只能使用它。你知道任何现成的、易于使用的库可以以简单的方式完成吗?存在吗?

【问题讨论】:

  • @EJoshuaS 您好,感谢您的关注。嗯,另一个问题和我的不太一样。它基于正则表达式,而我的只是提及使用(我这里没有显示一行代码)。最后,如果我不能使用正则表达式来解决这个问题,我不介意。我只是想要一种方法来解决这个问题,整个问题,不管是什么方法。
  • @Loa 想起来可能不是完全重复的,但链接的帖子是相关的,因为它谈到了为什么你不想在这个任务中使用正则表达式
  • @EJoshuaS 我完全同意你的看法。谢谢你。如果你知道另一种方法可以满足我的需求,我会比现在更快乐,因为现在我知道我不能做什么。再次感谢您的关注,真的。 :)

标签: java html regex algorithm indexing


【解决方案1】:

您不能使用正则表达式来解析 HTML。有关更多信息,请参阅this question(包括this rather epic answer 以及其他几个有趣的答案),但 HTML 不是常规语言,因为它具有递归结构。

任何允许递归的语言在定义上都是不规则的,所以你不能用正则表达式解析它。

请记住,HTML 是 context-free languages(或至少是 pretty close to context-free)。另请参阅Chomsky hierarchy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多