2017-06-16 3 views
2

Je reçois une chaîne d'une base de données avec plusieurs balises HTML et je veux afficher les mots marqués avec des couleurs dans un terminal. J'ai essayé cela avec Perl6 mais je n'ai pas trouvé de solution de travail. Voici les étapes que j'essayées:Remplacer HTML <i> Tags avec du texte en couleur en Perl6

use v6; 

use Terminal::ANSIColor; 

my $str = "Text mit einem <i>kursiven</i> und noch einem <i>schrägen</i> Wort."; 
my $str1 = "Text mit einem { colored("kursiven" , 'blue') } und noch einem { colored("schrägen" , 'blue') } Wort."; 

say "\nOriginal String:"; 
say $str ~ "\n"; 

say "and how it should look like:"; 
say $str1 ~ "\n"; 

say "Var 01: Remove the tags in 2 steps:"; 
my $str_01 = $str.subst("<i>" , "" , :g).subst("</i>" , "" , :g); 
say $str_01; 
say "==> ok\n"; 

say "Var 02: Remove the tags with dynamic content:"; 
my $str_02 = $str.subst(/"<i>"(.*?)"</i>"/ , -> { $0 } , :g); 
say $str_02; 
say "==> ok with non greedy search\n"; 

say "Var 03: Turns static content into blue:"; 
my $str_03 = $str.subst(/"<i>kursiven</i>"/ , -> { colored("kursiven" , 'blue') } , :g); 
say $str_03; 
say "==> nearly ok but second part not replaced\n"; 

say "Var 04: Trying something similar to Var 01:"; 
my $str_04 = $str.subst("<i>" , "\{ colored\(\"" , :g) 
       .subst("</i>" , "\" , 'blue'\) }" , :g); 
say $str_04; 
say "==> final String is ok but the \{ \} is just displayed and not executed !!\n"; 


say "Var 05: Should turn dynamic content into blue"; 
my $str_05 = $str.subst(/"<i>(.*?)</i>"/ , -> { colored($0 , 'blue') } , :g); 
say $str_05; 
say "==> total fail\n"; 

Est-il possible de le faire en une seule étape ou ne je dois d'abord remplacer les balises et le texte avec un espace réservé statique puis remplacer à nouveau?

+0

Peut-être s/Eval/regex/dans les balises? – raiph

Répondre

2
$str.subst(

    :global, 

    /

     '<i>' ~ '</i>' # between these two tags: 

      (.*?) # match any character non-greedily 

    /, 

    # replace each occurrence with the following 
    Q:scalar[{ colored("$0" , 'blue') }] 

) 

Pour quelque chose de plus complexe, j'utiliser une grammaire combinée avec une classe d'actions.

+0

Je reçois un avertissement "Utilisation de Nil dans un contexte de chaîne ..." et il ne donne aucun résultat. Pour obtenir $ 0 en remplacement, je dois écrire -> {$ 0}. La même chose s'applique également pour l'appel de fonction à "coloré". Mais ça ne marche pas pour les deux. – user2944647

+0

@ Brad-Gilbert, Belle réponse. S'il vous plaît envisager d'ajouter une phrase ou deux ici dans les commentaires ou dans votre réponse sur la raison pour laquelle vous avez utilisé 'Q: scalar [{colored (" $ 0 ", 'blue')}]' plutôt que simple '{color (" $ 0 " , 'blue')} ', comme suggéré par @ user2944647. – raiph

2

Après avoir joué avec Brads réponse que je trouve le travail suivant:

$str.subst(

    :global, 

    /

     '<i>' ~ '</i>' # between these two tags: 

      (.*?) # match any character non-greedily 

    /, 

    # replace each occurrence with the following 
    { colored("$0" , 'blue') } 

)