2010-06-25 10 views
0

J'ai essayé de coloriser dans rebol une url comme celui-ciComment analyser/coloriser les paires mot-clé/valeur dans l'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 

Mais la sortie est pas juste (voir par exemple deux font color = "blue" à la fin):

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> 

Qu'est-ce que le bon Règle

Répondre

1

Il y a probablement des règles plus élégantes mais cela semble fonctionner pour vos données, en supposant que j'ai deviné ce que vous voulez.

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

J'ai regardé le résultat: ça donne ce que je voulais merci. Maintenant, je vais me gratter la tête pour comprendre votre code. Parfois, parse semble difficile pour les exigences simples :) Peut-être dans ce genre de cas, regex est plus simple? –

+0

Ce que j'essaie toujours de faire est une règle de composition pour les règles d'analyse (commencer avec 2 règles indépendantes et les agréger) mais cela ne semble pas possible ou difficile avec parse. –

+0

Tout ce qu'il fait est de trouver les paires autour du =, marque l'endroit où chaque chaîne doit être insérée, puis insère le 2ème en premier (si j'ai inséré le premier en premier, alors la position du second sera modifiée), et puis la première seconde. Je saute ensuite les choses que j'ai insérées. Après la police bleue, je vérifie ensuite si je suis à la fin. Vous pouvez le faire avec plusieurs règles, mais je l'ai fait en un seul. –

0

Vous n'avez pas spécifié à quoi ressemblerait la sortie correcte, et donc soumettre un code incorrect et nous demander de deviner ce que vous essayiez de faire est un peu trop! Je vais, comme d'habitude, suggérer de réduire votre exemple au plus petit possible qui reproduit votre problème. (Cela vous mènera souvent à la solution avant que vous devez poser la question!)

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

Mais au large de la manchette, je soupçonne que vous rencontrez le fait que tout code entre parenthèses est exécutée pendant le match de la règle , si la règle finit par correspondre ou non. Regardez cet exemple simple:

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

Bien que la première règle ait échoué, vous obtenez les deux impressions! L'impression de rule-1 s'est produite parce que le code entre parenthèses a été exécuté avant que l'échec ait été déterminé. Votre «any» exécutant deux règles qui peuvent ou non correspondre, faire les deux insertions avant de déterminer la correspondance complète, ressemble à votre problème.

+0

Désolé HostileFork, je ne pouvais pas faire un exemple simple parce que quand c'est simple, ça a marché :) Quant au résultat, je voulais que ce soit dans la question. –