我有一个非常大的文章数据库,不同长度。这些文章中包含HTML元素。我必须在每篇文章的正文中插入一些广告(简单< script>元素)(我知道,我讨厌打断我阅读的广告)。
现在,问题是必须在每篇文章的大致相同位置插入每个广告。最简单的解决方案是简单地将文章分成固定数量的字符(不破坏单词),然后插入广告代码。但是,这会冒着将广告插入HTML代码中间的风险。
我可以采用正则表达式方式,但我正在考虑以下解决方案,使用JS:
一旦计数超过阈值,请做出以下决定:
4.1。如果计数超过阈值的值低于正可接受的偏差(例如,17个字符),请在当前文本节点之后插入广告代码。
4.2。如果计数大于阈值和偏差之和,则回滚到上一个文本节点,并做出相同的决定,只有这次使用前一个计数并检查它是否低于阈值和偏差之间的差值,如果没有,请在当前节点和前一节点之间插入广告。
4.3。如果4.1和4.2失败(这意味着前一个节点的字符数太少而当前节点太高),则在当前元素内需要任何字符数后插入广告。
我知道这很复杂,但这是我脑海中的第一件事,它的优势在于,通过尝试在文本节点之间插入广告,也许它不会破坏文章的流程,就像它会破坏文章的流程一样糟糕我会坚持下去(比如最后的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 :服务器端和客户端解决方案对我来说都没问题。
答案 0 :(得分:1)
在单词休息时失败了。如果失败了,就把它强加在角色之间。 (为了掩盖奇怪的角落案件。)
所以这是K.I.S.S.溶液强>
只是对您首选的解决方案进行级联故障 :
除了奇怪的情况外,这种情况永远不会发生。
这种情况很少发生,只有格式不正确的文本,奇怪的外星语言等。
这只会偶尔发生,作者不使用分段符。
这就是通常会发生的事情。
我不会打扰复杂的想法,比如在附近的案件中进行回溯等等。这显然不值得。它几乎总能为您提供更好的整体长期解决方案,以采取一致,简单的“级联故障”方法。做上面的事情你就完成了!
艺术比科学更像这样。你会喜欢上述内容,希望它有所帮助!
显然,调整我在上面的伪代码中输入的数字。像这样的工作的大部分工作是在实际的测试平台上调整参数。编写代码本身并不算什么,你需要创建一个好的测试平台,这样你就可以在眼前看到并且看到它正常工作(理想情况下包括参数的“拨号”,所以你可以实时看到结果,你知道吗? )你就是这样做的!