在不破坏阅读流程或HTML代码的情况下拆分文章的算法

时间:2010-06-16 14:30:54

标签: algorithm split

我有一个非常大的文章数据库,不同长度。这些文章中包含HTML元素。我必须在每篇文章的正文中插入一些广告(简单< script>元素)(我知道,我讨厌打断我阅读的广告)。

现在,问题是必须在每篇文章的大致相同位置插入每个广告。最简单的解决方案是简单地将文章分成固定数量的字符(不破坏单词),然后插入广告代码。但是,这会冒着将广告插入HTML代码中间的风险。

我可以采用正则表达式方式,但我正在考虑以下解决方案,使用JS:

  1. 确定字符数阈值。例如,“添加应插入约200字”
  2. 在每个方向设置接受的偏差,例如-20,+ 20个字符。
  3. 循环浏览文章中的每个文字节点,同时保持计算到目前为止的总字符数
  4. 一旦计数超过阈值,请做出以下决定:

    4.1。如果计数超过阈值的值低于正可接受的偏差(例如,17个字符),请在当前文本节点之后插入广告代码。

    4.2。如果计数大于阈值和偏差之和,则回滚到上一个文本节点,并做出相同的决定,只有这次使用前一个计数并检查它是否低于阈值和偏差之间的差值,如果没有,请在当前节点和前一节点之间插入广告。

    4.3。如果4.1和4.2失败(这意味着前一个节点的字符数太少而当前节点太高),则在当前元素内需要任何字符数后插入广告。

  5. 我知道这很复杂,但这是我脑海中的第一件事,它的优势在于,通过尝试在文本节点之间插入广告,也许它不会破坏文章的流程,就像它会破坏文章的流程一样糟糕我会坚持下去(比如最后的4.3例)

    这是我放在一起的一些伪代码,我不相信我的英语解释技巧:

    threshold = 200
    deviation = 20
    current_count = 0
    
    for each node in article_nodes {
        previous_count = current_count
        current_count = current_count + node.length
        if current_count < threshold {
            continue // next interation
        }
    
        if current_count > threshold + deviation {
            if previous_count < threshdold - deviation {
                // insert ad in current node
            } else {
                // insert ad between the current and previous nodes
            }
        } else {
            // insert ad after the current node
        }
    
        break;
    }
    

    我是否过于复杂,或者我错过了一个更简单,更优雅的解决方案?

    PS :服务器端和客户端解决方案对我来说都没问题。

1 个答案:

答案 0 :(得分:1)

  1. 我只会在段落(可能是p标签)或换行符(可能是br标签)中插入广告。
  2. 在单词休息时失败了。如果失败了,就把它强加在角色之间。 (为了掩盖奇怪的角落案件。)

    所以这是K.I.S.S.溶液

    1. 随时计算字母,单词,行和段落。
    2. 只是对您首选的解决方案进行级联故障

      1. 如果您使用2000个字符 - 只需强行插入广告并从头开始重新计算所有内容。
      2. 除了奇怪的情况外,这种情况永远不会发生。

        1. 如果你得到250个单词 - 只需强行加入广告并从头开始重新计算所有内容。
        2. 这种情况很少发生,只有格式不正确的文本,奇怪的外星语言等。

          1. 如果你有50个新行 - 只需强行加入广告并从头开始重新计算所有内容。
          2. 这只会偶尔发生,作者不使用分段符。

            1. 最后,如果你得到3个新段落 - 加入广告并从头开始重新计算所有内容。
            2. 这就是通常会发生的事情。

              不会打扰复杂的想法,比如在附近的案件中进行回溯等等。这显然不值得。它几乎总能为您提供更好的整体长期解决方案,以采取一致,简单的“级联故障”方法。做上面的事情你就完成了!

              艺术比科学更像这样。你会喜欢上述内容,希望它有所帮助!

              显然,调整我在上面的伪代码中输入的数字。像这样的工作的大部分工作是在实际的测试平台上调整参数。编写代码本身并不算什么,你需要创建一个好的测试平台,这样你就可以在眼前看到并且看到它正常工作(理想情况下包括参数的“拨号”,所以你可以实时看到结果,你知道吗? )你就是这样做的!