1

我有以下解析问题。在下面的第一个示例文本中,解析将在找到文本中的部分时命中两个命令块。

试试下面的(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

但是,如果我插入命令的 change/part 部分,预计会删除它找到的文本,第一个 change/part 会执行,但 parse 命令的第二部分似乎停止,因为第二个执行块没有触发.


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 是正确的解决方案。

谁能看到我做错了什么?

4

1 回答 1

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改变后得到的。

如果您修改了解析输入,最好的建议是重新设置/初始化您的内部解析指针:删除后,您应该回到删除的开头,插入/修改后,您应该先回到开头,然后再到结尾的新项目。

于 2014-09-09T13:05:39.547 回答