1

次の解析の問題があります。以下の最初のサンプル テキストでは、解析はテキスト内のパーツを見つけるときに 2 つのコマンド ブロックにヒットします。

以下を試してみてください(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

ただし、見つかったテキストを削除することが期待されるコマンドの変更/部分部分を挿入すると、最初の変更/部分が実行されますが、2番目の実行ブロックがトリガーされないため、解析コマンドの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" 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>"

2 番目のコマンドは、Print が実行されておらず、解析が完了していないため、実行されていないように見えることに注意してください。

これらの 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 の内部数値インデックスにあります{);">}。change コマンドの後、インデックスはまだ 95 のままですが、サンプル テキストははるかに短くなり、解析ポインターは 2 番目の検索テキスト"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 に答える