如何在不使用浏览器的情况下将缺少的html标签添加到字符串中?

时间:2017-01-29 21:57:25

标签: javascript html

我问另一个question关于如何修复缺少标签的HTML sting,我得到的答案是使用DOMParser或innerHTML。这两个都像魅力一样,但这让我思考,如何在没有浏览器的帮助下实现这一目标?例如,如果我想在Node中操作这个字符串?

我提到的示例字符串如下:

"This <small>is <i>ONE</small> Messed up string</i>."

我想修复它,看起来像:

"This <small>is <i>ONE</i></small><i> Messed up string</i>."

我的想法是使用子串和连接的组合,并附加一个缺少的结束标记,或者添加一个缺少的开始标记,但它似乎是一个业余的移动。

1 个答案:

答案 0 :(得分:2)

从头开始执行此操作的最强大的方法(例如,在没有浏览器帮助的情况下)将编写一个解析器,该解析器了解您的“损坏”语法并在解析时输出“正确”语法。您必须决定何时添加缺少的标签。这将适用于几页代码,但想法如下:

首先编写一个可以在“标记”中读取字符串的标记生成器。您可能希望阅读文本片段并将其分类为开始标记,内容或关闭标记。通过在状态机中迭代字符串的每个字符来跟踪上下文,理解转义序列并发出令牌列表,这是最简单的方法。

接下来写另一个读取这些令牌的状态机。

  • 每次遇到开始标记令牌时,都会将令牌的原始值附加到结果字符串,并将当前打开的开始标记(如果有)推送到堆栈
  • 当您到达内容标记时,您只需编写原始标记值
  • 当您到达结束标记时,您将检查是否与当前的开始标记匹配。如果没有,您可以在结果字符串中写一个假的“开始标记”以匹配结束标记,然后是结束标记的原始值。如果它与当前的开始标记匹配,那么您将编写结束标记,并从上述堆栈中弹出最新的开始标记。如果堆栈是空的,你会认为你不再是一个标签了。

完成所有令牌后,如果堆栈不为空,请在堆栈上预先启动标记,将伪造的结束标记写入结果。