【问题标题】:Rebol / Red Parse html rules returns true but nothing is insertedRebol / Red Parse html 规则返回 true 但没有插入任何内容
【发布时间】:2017-10-28 08:49:27
【问题描述】:

我有一个返回 true 的解析规则,但它没有按预期插入我的文本:html 没有改变,而它应该插入到主关闭 div 的末尾。我尝试使用像How to parse inside HTML tags with REBOL?这样的计数器

更新:我也不知道如何在 counter = 0 时立即中断解析,以免在 main 之后的最后一个关闭 div 之前插入文本。

    content: {<div class="main">
      <h1>
        Big TITLE
      </h1>
      <div>
        <section>
          <p>a paragraph</p>
        </section>
         <section>
          <p>a paragraph</p>
        </section>
          <section>
          <p>a paragraph</p>
        </section>
       </div>
       <div>
          <p>Blah Blah</p>
       </div>

    </div>
    <div>
      Another Div
    </div>
    }

    rules: [
      thru <div class="main">
      (div-count: 1)
      some [
        to "<div" (++ div-count) thru "<div" thru ">"
        |
        to </div> mark: (-- div-count if div-count = 0 [insert mark "closing main div"]) thru </div>
      ]
      to end 
    ]
    parse content rules

【问题讨论】:

  • 您引用的答案将输入字符串转换为结构化块。如果您自己尝试使用 HTML 进行字符串解析……那就是 danger zooone! PARSE 比 RegEx 和 strictly more powerful 更清晰,但大多数 warning about trying to process HTML directly with RegEx 也适用于 PARSE。见@rgchris 的markup work(他在这里和Red gitter 上聊天)
  • @HostileFork 我不需要也不想要一个完整的 html 解析器,我只需要解析非常具体的 html,因此规则通常非常简单。在上面的例子中,这似乎是微不足道的想法,除了它返回 true 但仍然没有插入,我不明白为什么。
  • 我理解保持简单的愿望,但也需要意识到(正如有关 RegEx 的链接帖子指出的那样)存在限制。如果它只是又快又脏,好吧,但那是一次性脚本......

标签: parsing html-parsing rebol red


【解决方案1】:

这里有一个解决方案,使用 probe 进行调试

rules: [
     thru <div class="main">
     (div-count: 1)
      some [
        "<div" (probe ++ div-count) skip
      |
        "</div>" mark:  ( probe -- div-count   if div-count = 0 [insert mark "closing main div"]) skip 
      |  skip
     ]
  ]
parse/all content rules 

您的规则的问题是,div-count 永远不会或很少被减去。解析指针直接指向下一个打开 div,因为 to 始终是第一个满足的条件。

如果在成功条件后添加 to end,则可以从 parse 中突围或更好地返回。如果您不确定使用括号将 [ 成功的子规则 ... 到结束 ]

分组

一个结束规则的例子

end-rule: [] ; or none
rules: [
    thru <div class="main">
    (div-count: 1)
    some [
        ["<div" (++ div-count) skip]
    |
        ["</div>"mark:  (-- div-count   if div-count = 0 [insert mark "closing main div"  end-rule: [to end]]) end-rule ]
    |  skip
]

]

【讨论】:

  • hi 的效果比我的好 :) 但我不明白为什么 skip 有效而不是 thru:skip 只跳过一个字符。另外我忘了问如何只在第一个 div count = 0 插入?因为我只想插入 div 主类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2021-09-24
相关资源
最近更新 更多