如何正确解析配对的html标签?

时间:2017-05-13 09:46:44

标签: rebol rebol3

问题是解析通过加载/标记获得的html流,你可以获得html标签组成部分,即当你找到

<div id="one">my text</div> 

你应该以&lt; div id =“one”&gt;,{my text}和&lt; / div&gt;之类的结尾。在同一容器中,类似

[<div id="one"> {my text} </div>] 

甚至更好

[<div> [id {one}] {my text} </div>]

解析问题是匹配成对的html标签,在html中,标签可能是一个空标签,可能属性但没有内容,因此没有结束标签或普通标签可能带有属性和内容,因此结束标签,但两者都是标签类型只是一个标签

我的意思是当你找到像&lt; p&gt;这样的序列时,有些单词&lt; / p&gt;你有一个P标签就像你得到的一样,&lt; p /&gt;只是一个P标签,在第一种情况下你有关联的文本和结束标签,在后者你没有,这都是

换句话说,html属性和内容是html中tag元素的属性,因此在json中表示这一点你会得到像:

tag: { name: "div" attributes: { id: "one } content: "my text" }

这意味着你必须识别标签的内容,以便将其分配给正确的标签,就rebol解析而言,这意味着标识匹配的标签(打开标签和结束标签)

在rebol中,您可以轻松解析html序列,如:

<div id="yo">yeah!</div><br/>

遵守规则:

[ some [ tag! string! tag! | tag! ]]

但是使用此规则您将匹配html

<div id="yo">yeah!</div><br/> 

以及

<div id="yo">yeah!</p><br/> 

是相同的

所以你需要一种方法来匹配相同的开始标记出现在结束位置

遗憾的是,rebol标签不能(AFAIK)使用标签名称进行参数化,所以你不能这样说:

[ some [ set t1 tag! set s string! set t2 tag!#t1/1 | tag! ] ]

t1 / 1表示法是由于rebol的(坏)功能,包括标签名称相同级别的所有标签属性(另一个不良功能不是将匹配标签重新识别为同一标签)

当然,您可以使用以下代码实现目标:

tags: copy []
html: {<div id="yo">yeah!</p><br/>}
parse html [ some [ set t1 tag! set s string! set t2 tag! (tag: first make block! t1 if none <> find t2 tag [append/only tags reduce [t1 s] ]) | tag! (append/only tags reduce [t1])]]

但我们的想法是使用仅使用解析方言的更优雅和天真的方法

1 个答案:

答案 0 :(得分:1)

有一种方法可以解析rebol解析方言中的项目对,只需使用一个单词来存储预期的对:

parse ["a" "a"] [some [set s string! s ]]
parse ["a" "a" "b" "b"] [some [set s string! s ]]

但是由于标签带有属性和特殊的结束标记(/),这对标签不起作用,因此从初始标记中找不到结束对是不容易的:

parse [<p> "some text" </p>] [some [ set t tag! set s string! t ]
parse [<div id="d1"> "some text" </div>] [some [ set t tag! set s string! t ]

没有工作原因&lt; / p&gt;不等于&lt; p&gt;并且都不是&lt; / div&gt;等于&lt; div id =&#34; d1&#34;&gt;

您可以再次使用代码修复它:

parse load/markup "<p>preug</p>something<br />" [
    some [
        set t tag! (
            b: copy t remove/part find b " " tail b
            insert b "/"
        )
        set s string!
        b (print [t s b])
    |
        tag!
    |
        string!
    ]
]

但这不再是简单和禅代码,所以问题仍然存在; - )