gpt4 book ai didi

rebol - 如何正确解析成对的 html 标签?

转载 作者:行者123 更新时间:2023-12-04 15:52:23 25 4
gpt4 key购买 nike

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

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

你应该在同一个容器中以
, {my text} 和
结尾,比如
[<div id="one"> {my text} </div>] 

甚至更好
[<div> [id {one}] {my text} </div>]

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

我的意思是当你找到一个像

some words

这样的序列时,你有一个 P 标签,就像你得到一个像

这样的序列只是一个 P 标签一样,在第一种情况下,你有关联的文本和结束标签而在后者中你没有,仅此而已

换句话说,html 属性和内容是 html 中标签元素的属性,因此在 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])]]

但这个想法是使用更优雅和天真的方法只使用解析方言

最佳答案

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

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 ]

不起作用,因为

不等于

并且

都不等于


同样,您可以使用代码修复它:
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!
]
]

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

关于rebol - 如何正确解析成对的 html 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43951639/

25 4 0