Avatar billede bearhugx Nybegynder
28. januar 2004 - 09:28 Der er 10 kommentarer og
1 løsning

hvordan matcher jeg {0} {1} osv.

Hejsa eksperter
(ps: følgende kode er JavaScript, men problemet er med RegExp, derfor denne kategori)

Jeg har en template-streng, som f.eks. kunne se ud som følger
  var template = "Hejsa {0}, hvordan går det";

Herudover har jeg også en array med navne, som jeg vil hilse, baseret på ovenstående template
  var navne = new Array();
  navne[0] = "Michael";
  navne[1] = "Lars";
osv.

Jeg kunne så godt tænke mig at have en funktion som så udskrev
  Hejsa Michael, hvordan går det
  Hejsa Lars, hvordan går det

dvs. at {0} bliver erstattet med navnet

Derfor har jeg pt. følgende funktion som ikke virker, da jeg ikke kan finde ud af at matche "{0}"
  function applyToTemplate (s, arr) {
    for(i=0;i<arr.length;++i) {
      alert("searching field #"+i);
      search = "{["+i+"]}";
      var re = new RegExp(search, "gi");
      alert(re);
      s.replace(re, "*"+arr[i]+"*");
    }
    return s;
  }

  kaldt med applyToTemplate(template, navne[0]);

der går et eller andet galt, for den finder ingen "{0}" i template....

Hvad gør jeg galt ?

/Søren

PS: titlen på dette spørgsmål var egenligt
  Hvordan matcher jeg "{0}", "{1}", ...
men åbenbart må man ikke bruge " (eller ...) i spørgsmålstitler, derfor denne barberet version....
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 09:51 #1
function applyToTemplate (s, arr) {
    for(i=0;i<arr.length;++i) {
      alert("searching field #"+i);
      search = "\\{"+i+"\\}";
      var re = new RegExp(search, "gi");
      alert(re);
      s=s.replace(re, arr[i]);
    }
    return s;
  }
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 09:52 #2
Men den skal vel kaldes med
  applyToTemplate(template, navne);
ellers er andet argument ikke et array
Avatar billede roenving Novice
28. januar 2004 - 09:54 #3
Du kan bare lave denne simple:

<script type="text/javascript">
var template = "Hejsa {0}, hvordan går det";
var navne = new Array();
  navne[0] = "Michael";
  navne[1] = "Lars";

var reg = /\{\d+\}/g;
var num = template.match(reg,"$1");
num = +num[0].substring(1,num[0].length-1);
template = template.replace(reg,navne[num]);
alert(template);
</script>
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 10:04 #4
Prøv lige din, roenving, med: 
  var template = "Hejsa {0}, hvordan {1} går det";
Avatar billede bearhugx Nybegynder
28. januar 2004 - 10:07 #5
erik >> jo.. jeg skulle ikke have [0] med ... - det havde jeg heller ikke i koden, men er kommet til at skrive den med her...

nu siger min alert(re)
  /\{0\}/ig

men den finder ikke {0} endnu - der sker i hvert fald ikke nogen replace... :-/
Avatar billede roenving Novice
28. januar 2004 - 11:54 #6
Ja, det er jeg klar over, jeg fik barberet lidt tekst væk, da jeg sendte den, fordi jeg havde glemt, at det var derfor jeg havde skrevet den !-)

"Under forudsætning af, at der kun er en, kan du ..."
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 12:31 #7
Nu der er liv i eksperten.dk igen, så kommer det indlæg jeg ikke kunne før.
Jeg har nemlig dette eksempel til at virke:

  function applyToTemplate (s, arr) {
    for(i=0;i<arr.length;++i) {
      alert("searching field #"+i);
      search = "\\{"+i+"\\}";
      var re = new RegExp(search, "gi");
      alert(re);
      s=s.replace(re, arr[i]);
    }
    return s;
  }

alert(applyToTemplate("Her er {0} og {1} og {0} igen", Array("nummer0","nummer-jen")));

Men det er lidt kluntet at løbe igennem så mange gange, så et bedre eksempel
er dette, som er lidt i retning af det roenving måske har tænkt:


  function applyToTemplate (s, arr) {
    re = /\{(\d+)\}/gi;
    s=s.replace(re, function ($0,$1) { return arr[$1]; });
    return s;
  }

alert(applyToTemplate("Her er {0} og {1} og {0} igen", Array("nummer0","nummer-jen")));
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 12:32 #8
PS: Sidste eksempel virker kun i nyere JavaScript-versioner - husker ikke nummeret.
Avatar billede bearhugx Nybegynder
28. januar 2004 - 13:56 #9
erik >> dit sidste eksempel spiller bare - super godt ... noget siger mig at jeg skal til at lære hvad de $0 og $1 bruges til :-)))

lægger du et svar...


/* her der den kode, som jeg bruger */
String.prototype.applyToTemplate = function( fields ) {
    re = /\{(\d+)\}/gi;
    s = "" + this;
    s = s.replace(re, function($0,$1) {
        return fields[$1];
    });
    return s;
}

templateString = "Kære {0},\n Velkommen til {1}...,\n Vi håber De får et godt ophold under deres {2}.\n\n Deres værelsesnummer er {3}.\n\n Med venlig hilsen Personalet...";
fields = new Array();
fields[0] = "Hr. Møller";
fields[1] = "Ydegårds badehotel";
fields[2] = "konference";
fields[3] = "1056";
alert( templateString.applyToTemplate(fields) );
Avatar billede erikjacobsen Ekspert
28. januar 2004 - 13:58 #10
Det er så vidt jeg ved JavaScripts måde at simulere /e-parametren fra Perl.
Men ellers tak, jeg samler ikke på point - kun tilfredse kunder ;))
Avatar billede bearhugx Nybegynder
28. januar 2004 - 14:10 #11
tilfreds kan man vist godt sige jeg blev :-)))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester