问题是解析通过加载/标记获得的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])]]
但我们的想法是使用仅使用解析方言的更优雅和天真的方法
答案 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!
]
]
但这不再是简单和禅代码,所以问题仍然存在; - )