我有以下解析问题。在下面的第一个示例文本中,解析将在找到文本中的部分时命中两个命令块。
试试下面的内容(Rebol 2)。
sample-text: {<a href="javascript:gotoURL('displayContent.aspx?contentID=9&language=english#Deferred-member');">deferred member</a>}
remove-anchors: func [sample-text][
parse sample-text[
some [
to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9}
begin:
thru {);">}
ending:
(print "Command 1 executed" )
to "<"
begin:
thru ">"
ending:
(print "Command 2 executed" )
]
]
return sample-text
]
结果:
remove-anchors sample-text
Command 1 executed
Command 2 executed
但是,如果我插入命令的更改/部分部分(预期会删除它找到的文本),则第一个更改/部分执行但是看起来解析命令的第二部分停止,因为第二个执行块没有不要触发。
sample-text: {<a href="javascript:gotoURL('displayContent.aspx?contentID=9&language=english#Deferred-member');">deferred member</a>}
remove-anchors: func [sample-text][
parse sample-text[
some [
to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9}
begin:
thru {);">}
ending:
(print "Command 1 executed" change/part begin "" ending) ;<<----- change
to "<"
begin:
thru ">"
ending:
(print "Command 2 executed" change/part begin "" ending) ;<<----- change
]
]
return sample-text
]
结果:
remove-anchors sample-text
Command 1 executed
== "deferred member</a>"
注意第二个命令似乎没有执行打印未执行和解析未完成。
由于我在文本中有多种不同类型的链接,我试图从同一文本中删除这些HTML,并且多次出现,我认为PARSE是正确的解决方案。
谁能看到我做错了什么?
答案 0 :(得分:1)
如果您使用此功能,您的功能应该有效
remove-anchors: func [sample-text][
parse sample-text[
some [
to {<a href="javascript:gotoURL('displayContent.aspx?contentID=9}
begin:
thru {);">}
ending:
(print "Command 1 executed" change/part begin "" ending)
:begin ; note this
to "<"
begin:
thru ">"
ending:
(print "Command 2 executed" change/part begin "" ending)
]
]
return sample-text
说明:
内部解析指针在{);">}
之后的内部数字索引为95。在更改命令之后,索引仍然是95,但是样本文本现在要短得多,而你的第二个搜索文本"to "<"
之后的解析指针可能已经结束了。你可以看到,如果你使用这一行
(print "Command 1 executed" change/part begin "" ending print ending) ;<<----- change
在你的函数中,给你以下错误
** Script Error: Out of range or past end
** Where: remove-anchors
** Near: print ending
因此,您必须将解析索引/指针设置回点的开头,您可以在其中更改/删除文本。这是您在更改后获得的:begin
。
最好的建议是重新设置/初始化你的内部解析指针,如果你修改了你的解析输入:删除后你应该回到删除的开始,插入/修改后你应该先到开始然后再开始到新项目的结尾。