使用更改命令(Rebol2)时解析问题

时间:2014-08-29 20:36:01

标签: parsing rebol rebol2

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

试试下面的内容(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是正确的解决方案。

谁能看到我做错了什么?

1 个答案:

答案 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

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