Как разобрать / раскрасить пары ключевое слово / значение в URL? - PullRequest
0 голосов
/ 26 июня 2010

Я пытался раскрасить в реболе URL-адрес, подобный этому

content: "http://domain.com/test.php?keyword=hdhdf&hdhd=sdcfsv&sbcfsv=sdncfd&sncfsdv=dncsv&cnsv=dshdkd&scsv=12334&DXV=D&SWJDJJDFDJQKKKKKKKKKKKK&DFG=V&DJJF=DJVNVV&DJFFFFFFFFFF=33333"

rule-keyword-0: [to "?" thru "?" mark: (insert mark {<font color="red">}) 19 skip to "=" mark: (insert mark "</font>") thru "="]
rule-keyword-1: [to "&" thru "&" mark: (insert mark {<font color="red">}) 19 skip to "=" mark: (insert mark "</font>") thru "="] 

rule-value-0: [to "</font>=" thru "</font>=" mark: (insert mark {<font color="blue">}) 20 skip to "&" mark: (insert mark "</font>") thru "&"]
rule-value-1: [to "</font>=" thru "</font>=" mark: (insert mark {<font color="blue">}) 20 skip to end mark: (insert mark "</font>")] 

rule-keyword: [any [rule-keyword-0 | rule-keyword-1] to end]
rule-value: [any [rule-value-0 | rule-value-1] to end]

parse content rule-keyword
parse content rule-value

Но вывод неправильный (см., Например, double font color = "blue" в конце):

http://domain.com/test.php?<font color="red">keyword</font>=<font color="blue">hdhdf</font>&<font color="red">hdhd</font>=<font color="blue">sdcfsv</font>&<font color="red">sbcfsv</font>=<font color="blue">sdncfd</font>&<font color="red">sncfsdv</font>=<font color="blue">dncsv</font>&<font color="red">cnsv</font>=<font color="blue">dshdkd</font>&<font color="red">scsv</font>=<font color="blue">12334</font>&<font color="red">DXV</font>=<font color="blue">D&<font color="red">SWJDJJDFDJQKKKKKKKKKKKK</font>&DFG</font>=<font color="blue">V&<font color="red">DJJF</font>=DJVNVV</font>&<font color="red">DJFFFFFFFFFF</font>=<font color="blue"><font color="blue">33333</font>

Какое правильное правило

Ответы [ 2 ]

1 голос
/ 26 июня 2010

Возможно, есть более элегантные правила, но, похоже, это работает для ваших данных, если предположить, что я угадал, что вы хотите.

   content: "http://domain.com/test.php?keyword=hdhdf&hdhd=sdcfsv&sbcfsv=sdncfd&sncfsdv=dncsv&cnsv=dshdkd&scsv=12334&DXV=D&SWJDJJDFDJQKKKKKKKKKKKK&DFG=V&DJJF=DJVNVV&DJFFFFFFFFFF=33333"


    result: parse content [
        thru "?"
        some [
            ; we should be at the beginning of the pairs
            mark1: 
            copy stuff to "=" mark2: (
                ; to ensure that there is a pair here
                if stuff [
                    insert mark2 </font>
                    insert mark1 <font color="red">
                ]
            )
            ; find the = sign
            thru </font> thru #"="
            mark1:
            [ copy stuff to #"&" | copy stuff to end ]
            mark2: 
            (   if stuff [
                    insert mark2 </font> 
                    insert mark1 <font color="blue">
                ]
            )   
            thru </font>
            [ thru "&" | end ]  
        ]
    ]

    ?? result
    ?? content
0 голосов
/ 26 июня 2010

Вы не указали, как будет выглядеть правильный вывод, поэтому отправка неверного кода и просьба угадать, что вы пытаетесь сделать, - это немного!Я, как обычно, предложу свести ваш пример к наименьшему возможному, который воспроизводит вашу проблему.(Это часто приводит вас к решению, прежде чем вы зададите вопрос!)

http://catb.org/esr/faqs/smart-questions.html#code

Но я не уверен, что вы испытываете тот факт, что любой код в скобкахвыполняется во время сопоставления правила, независимо от того, заканчивается правило или нет.Посмотрите на этот простой пример:

>> rule-1: ["a" (print "a matched in rule-1") "b"]
== ["a" (print "a matched in rule-1") "b"]

>> rule-2: ["a" (print "a matched in rule-2") "c"]
== ["a" (print "a matched in rule-2") "c"]

>> parse "ac" [any [rule-1 | rule-2]]
a matched in rule-1
a matched in rule-2
== true

Хотя первое правило не удалось, вы получите обе распечатки!Распечатка из rule-1 произошла из-за того, что код в скобках, выполненный до того, как была обнаружена ошибка.

Ваше «любое» выполняет два правила, которые могут совпадать или не совпадать, причем оба выполняют вставки до выяснения полного соответствиявыглядит как ваша проблема.

...