Rebol/Red Parse条件标记问题:HTML规则返回true却无插入,如何标记首个main div结尾?
解决Rebol/Red Parse中标记第一个main div结尾的问题
我来帮你搞定这个Parse处理HTML的问题~咱们一步步拆解解决:
一、核心思路:跟踪层级+状态标记
要精准标记第一个main类div的结尾,得同时盯两个关键状态:
div-count:记录当前div的嵌套层级,遇到<div>就+1,遇到</div>就-1found-first-main-end:标记是否已经处理过第一个main div的结尾,防止误处理第二个main div
二、完整代码示例
html: {<div class="main"> <h1> Big TITLE </h1> <div> <section> <p>a paragraph</p> </section> </div> </div> <div class="main"> <h2> Another Title </h2> </div>} result: copy "" div-count: 0 found-first-main-end: false parse html [ any [ ; 定位到第一个main div的起始标签 to "<div class="main">" copy before-tag to ">" insert result before-tag skip ; 跳过标签的闭合">" div-count: 1 ; 初始化main div的层级为1 ; 处理main div内部的内容 any [ ; 复制到下一个div标签或结束位置的内容 copy content to [<div> | </div> | end] insert result content ; 判断遇到的是开标签还是闭标签 either "<div>" [ div-count: div-count + 1 insert result "<div>" skip ] [ if "</div>" [ div-count: div-count - 1 insert result "</div>" skip ; 当层级回到0且未标记过第一个结尾时插入标记 if div-count = 0 and not found-first-main-end [ insert result "<!-- END OF FIRST MAIN DIV -->" found-first-main-end: true ] ] ] ; 可选:标记完成后直接跳出Parse,提升效率 if found-first-main-end [break] ] ; 避免继续处理后续的main div if found-first-main-end [break] ] ] print result
三、关键细节说明
- 层级跟踪:
div-count变量精准记录嵌套深度,确保只在第一个main div的最外层闭标签(层级回到0)时插入标记,不会被内部嵌套的div干扰。 - 状态标记:
found-first-main-end变量确保即使后续有第二个main div,也不会重复执行插入逻辑。 - 条件跳出Parse:直接用
break指令就行!在规则里判断变量条件(比如found-first-main-end为true)时执行break,就能立即终止Parse过程,完美解决你问的「根据变量值条件跳出Parse」的需求。
四、为什么你之前的代码没插入内容?
大概率是这两个原因:
- 没有正确跟踪div的嵌套层级,导致判断
div-count=0的时机不对; - 没有设置状态标记,误把第二个main div的结尾也当成了目标,但后续逻辑又跳过了插入,所以Parse返回true却没实际插入内容。
内容的提问来源于stack exchange,提问作者user310291
相关产品推荐
相关产品推荐

