2010-06-25 4 views
0

я попытался раскрасить в Rebol в URL, как этотКак разобрать/раскрасить ключевые слова/пары значений в 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 

Но выход не правильно (см цвет пример двойного шрифта = «синий» в конце):

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> 

Что правильно Правило

ответ

1

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

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

Я посмотрел на результат: это дает то, что я хотел. Теперь я буду царапать голову, чтобы понять ваш код. Иногда синтаксический анализ кажется сложным для простых требований. Может быть, в таком случае регулярное выражение проще? –

+0

То, что я всегда пытаюсь сделать, - это какое-то правило композиции для правил синтаксического анализа (начинайте с 2 независимых правил и суммируйте их), но это не кажется возможным или сложным при анализе. –

+0

Все, что есть, это найти пары вокруг =, отмечает место, где должна быть вставлена ​​каждая строка, а затем вставляет второй первый (если я вставил первый первый, тогда положение второго будет изменено), а затем на 1-ю секунду. Затем я пропускаю материал, который я вставил. После синего шрифта я затем проверю, не закончил ли я. Вы можете сделать это с несколькими правилами, но я просто сделал это в одном. –

0

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

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 произошла из-за того, что код в круглых скобках, выполненных до отказа, был определен.

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

+0

Извините HostileFork, я не мог сделать простой пример, потому что, когда это просто, он работал. Что касается результата, я хотел, чтобы это было в вопросе. –