Avatar billede ducks Nybegynder
07. december 2003 - 17:45 Der er 49 kommentarer og
1 løsning

Tælle antal gange ordet står i textarea

Hvordan kan man med javascript finde ud af hvor mange gange der fx står "eksperten" i et textarea?
Avatar billede roenving Novice
07. december 2003 - 17:48 #1
var reg = /eksperten/gi;
var num = document.forms[0].textareaNavn.value.match(reg).length;
Avatar billede roenving Novice
07. december 2003 - 17:52 #2
Skulle lige teste ...

-- velbekomme '-)
Avatar billede ducks Nybegynder
07. december 2003 - 17:55 #3
Hvis formen hedder 'form1' og textaret hedder 'txta' skulle den så ikke se sådan ud:

var reg = /eksperten/gi;
var num = document.form1[0].txta.value.match(reg).length;

Den siger det ikke er en null eller et object.
Avatar billede ducks Nybegynder
07. december 2003 - 17:57 #4
Jeg har sat det i en function:

function test1() {
  var reg = /eksperten/gi;
  var num = document.form1[0].txta.value.match(reg).length;
}

Og kalder den ved:

<a href="java script:test1()">Test</a>
Avatar billede roenving Novice
07. december 2003 - 17:57 #5
Du har et [0] for meget med ...

var reg = /eksperten/gi;
var num = document.form1.txta.value.match(reg).length;
Avatar billede ducks Nybegynder
07. december 2003 - 17:59 #6
Nu siger den object expected :\
Avatar billede roenving Novice
07. december 2003 - 18:02 #7
Jeg testede den med:

<script language="javascript" type="text/javascript">
function showNum(fld){
var reg = /eksperten/gi;
alert(fld.value.match(reg).length);
}
</script>

<textarea name="mitTextarea" id="mitTextarea" cols="40" rows="5" onchange="showNum(this);"></textarea>
Avatar billede ducks Nybegynder
07. december 2003 - 18:04 #8
Sådan nu fik jeg det til at virke :) .. takker
Avatar billede roenving Novice
07. december 2003 - 18:06 #9
-- og tak for points ;~}
Avatar billede ducks Nybegynder
07. december 2003 - 18:07 #10
Men det ser ud som om, den laver fejl hvis ordet ikke er der. Er det fordi jeg skal bruge return false; eller sådan noget?
Avatar billede roenving Novice
07. december 2003 - 18:10 #11
-- Okay, den overså jeg ,-|

.match returnerer null, hvis der ikke er et match, så her kan du se ideen i at bruge den:

<script language="javascript" type="text/javascript">
function showNum(fld){
var reg = /eksperten/gi;
var num = fld.value.match(reg).length;
if(num)alert(num);
}
</script>
Avatar billede roenving Novice
07. december 2003 - 18:11 #12
Øv ...

<script language="javascript" type="text/javascript">
function showNum(fld){
var reg = /eksperten/gi;
var num = fld.value.match(reg);
if(num)alert(num.length);
}
</script>
Avatar billede roenving Novice
07. december 2003 - 18:12 #13
if(num)alert(num.length)
else alert(0);
Avatar billede roenving Novice
07. december 2003 - 18:13 #14
-- og som variabel:

antal = (num)?num.length:0;
Avatar billede ducks Nybegynder
07. december 2003 - 18:39 #15
Takker, hvis andre skulle få brug for at den viser 0:

function showNum(){
  var reg = /eksperten/gi;
  var num = document.form.textarea.value.match(reg);
  if(num) {
    alert(num.length);
  }
  else {
    alert(0);
  }
}
Avatar billede roenving Novice
07. december 2003 - 18:40 #16
18:12:19 virker også, når der bare er en enkelt linje !-)
Avatar billede ducks Nybegynder
07. december 2003 - 18:52 #17
Hvis jeg så sætter det ind i et script, for at tælle antal og , siger den at, er -1 [/b] er -1 er 0. Burde [b] ikke give 0?

function test1(){
  var doc = document.answer.message
  var BStart = //gi;
  var BEnd = /
/gi;
  var numBStart = doc.value.match(BStart);
  var numBEnd = doc.value.match(BEnd);
  if((numBStart) && (numBEnd)) {
    alert(numBStart.length - numBEnd.length);
  }
  else {
    alert(0);
  }
}
Avatar billede roenving Novice
07. december 2003 - 18:55 #18
[] og / er special-karakterer i RegExp, så de skal escapes:

  var BStart = /\[b\]/gi;
  var BEnd = /\[\/b\]/gi;
Avatar billede ducks Nybegynder
07. december 2003 - 18:58 #19
Nu siger den 0 hele tiden :\
Avatar billede ducks Nybegynder
07. december 2003 - 19:00 #20
Skal jeg lave et eller andet, hvor jeg gør [/b] til et negativt tal og pludser dem sammen bagefter?
Avatar billede roenving Novice
07. december 2003 - 19:04 #21
Det skulle ikke være nødvendigt ...

og jeg testede lige med [b][b] og fik svaret 2 !-)
Avatar billede ducks Nybegynder
07. december 2003 - 19:28 #22
Hvis man skriver:


Får man not ok:

  function test1(){
    var doc = document.answer.message
    var BStart = /\[b\]/gi;
    var BEnd = /\[\/b\]/gi;
    var numBStart = doc.value.match(BStart);
    var numBEnd = doc.value.match(BEnd);
    if(numBStart==numBEnd) {
      alert('ok');
    }
    else {
      alert('not ok');
    }
  }


Er det for stort, det jeg er igang med?
Avatar billede roenving Novice
07. december 2003 - 19:34 #23
-- nej, men du er jo ikke klar over, at .match returnerer et array af matches, og det vil sige at du prøver at sammenligne:

[""] == [""]

-- og de er jo ikke ens, du bliver nødt til:

if(numBStart&&numBEnd&&numBStart.length==numBEnd.length) {
Avatar billede ducks Nybegynder
07. december 2003 - 19:55 #24
Når man så prøver at få den til at gøre det med 3 forskellige, vil den ikke.

  function test1(){
    var doc = document.answer.message

    var BStart = /\[b\]/gi;
    var BEnd = /\[\/b\]/gi;
    var numBStart = doc.value.match(BStart);
    var numBEnd = doc.value.match(BEnd);
    if(numBStart&&numBEnd&&numBStart.length==numBEnd.length) var CodeB = 1

    var UStart = /\[u\]/gi;
    var UEnd = /\[\/u\]/gi;
    var numUStart = doc.value.match(UStart);
    var numUEnd = doc.value.match(UEnd);
    if(numUStart&&numUEnd&&numUStart.length==numUEnd.length) var CodeU = 1

    var IStart = /\[i\]/gi;
    var IEnd = /\[\/i\]/gi;
    var numIStart = doc.value.match(IStart);
    var numIEnd = .value.match(IEnd);
    if(numIStart&&numIEnd&&numIStart.length==numIEnd.length) var CodeI = 1

    if((!CodeB=1) && (!CodeU) && (!CodeI)) {
      return false;
    }
  }
Avatar billede ducks Nybegynder
07. december 2003 - 20:01 #25
Kan se jeg ihvertfald skal bruge || istedet for &&, men det hjælper ikke på at jeg får object expected.
Avatar billede roenving Novice
07. december 2003 - 20:07 #26
Hvad er du vil opnå ?-)

Ovenstående kode vil returnere false medmindre alle tre findes i et givet tekstarea, men det er vel valgfrit, om man vil skrive nogen af dem, så måske:

  function test1(){
    var codeB = CodeU = CodeI = true;
    var doc = document.answer.message;

    var BStart = /\[b\]/gi;
    var BEnd = /\[\/b\]/gi;
    var numBStart = doc.value.match(BStart);
    var numBEnd = doc.value.match(BEnd);
    if(numBStart&&numBEnd&&numBStart.length!=numBEnd.length)CodeB = false;

    var UStart = /\[u\]/gi;
    var UEnd = /\[\/u\]/gi;
    var numUStart = doc.value.match(UStart);
    var numUEnd = doc.value.match(UEnd);
    if(numUStart&&numUEnd&&numUStart.length!=numUEnd.length)CodeU = false;

    var IStart = /\[i\]/gi;
    var IEnd = /\[\/i\]/gi;
    var numIStart = doc.value.match(IStart);
    var numIEnd = .value.match(IEnd);
    if(numIStart&&numIEnd&&numIStart.length!=numIEnd.length)CodeI = false;

    if(!CodeB||!CodeU||!CodeI) {
      return false;
    }
  }
Avatar billede roenving Novice
07. december 2003 - 20:15 #27
Måske er det sådan, dine ifs skal se ud:

if((!numIStart&&numIEnd)|| (numIStart&&!numIEnd)|| (numIStart&&numIEnd&&numIStart.length!=numIEnd.length))CodeI = false;
Avatar billede ducks Nybegynder
07. december 2003 - 20:15 #28
Jeg vil gerne sørge for at alle [x] også bliver lukket igen med [/x], det er nok ikke muligt(?) at sørge for at der står [x]tekst[/x] og ikke [/x]tekst[x] eller at der ikke står [x]tekst[x]tekst[/x]tekst[/x] osv. Jeg har en anelse om at det har noget med RegExp at gøre? Jeg har bare ikke så meget forstand på lige netop det her :(
Avatar billede roenving Novice
07. december 2003 - 20:16 #29
Så det kun er, hvis der både findes nogen af hver og lige mange, det godkendes !-)
Avatar billede ducks Nybegynder
07. december 2003 - 20:18 #30
Netop..
Avatar billede roenving Novice
07. december 2003 - 20:20 #31
Ovenstående tager det det meste af vejen, men vi skal tænke helt anderledes, hvis det skal testes på den måde, du gerne vil ...

Muligt er det, men det er da meget besværligt, jeg tænker lige lidt !-)
Avatar billede ducks Nybegynder
07. december 2003 - 20:21 #32
Jeg har bare på fornemmelsen, at det jeg har fået lavet nu lidt er noget juks og at jeg skulle have forklaret det fra starten istedet for at tro jeg havde den rigtige løsning :(
Avatar billede roenving Novice
07. december 2003 - 20:34 #33
Jeg tror, at vi skal lave først en split på [, og derefter en split på ], for så kan vi sammen ligne parvis -- øjeblik !-)
Avatar billede roenving Novice
07. december 2003 - 20:35 #34
Men forresten, tillader du også nestede tags, altså tekst ?-)
Avatar billede ducks Nybegynder
07. december 2003 - 20:43 #35
Tror lige jeg prøver at beskrive det helt, så der ikke opstår misforståelser :)

Man kan skrive:
for <b></b>
for <i></i>
for <u></u>
""
for <table cellpadding=""0"" cellspacing=""0"" border=""0""><tr><td style=""border: 1px #000000 solid;""></td></tr></table>
[image=mitsite.dk/mig.jpg] for <img src=""mitsite.dk/mig.jpg"">
[URL]mitsite.dk[/URL] for <a href=""mitsite.dk"" target=""_blank"">mitesite.dk</a>
for <font face=""arial""></font>
for <font color=""#000000""></font>
Avatar billede roenving Novice
07. december 2003 - 21:03 #36
Så nestede tags er helt klart tilladt !-)

-- jeg har nu en, som fungerer med de simple et-bogstavs-tags, jeg må lige tænke lidt mere over de tags som har flere bogstaver og det, som godt må være åbent !-)

-- den forudsætter godt nok, at der ikke bruges [] i teksten, men det er vel en rimelig begrænsning ?-)

<script language="javascript" type="text/javascript">
function testTags(fld){
    var oT = new Array();
    var numoT = 0;
    var st = fld.value.split('[');
    if(st.length>1){
        for(i=1;st.length>i;i++){
            alert(st[i]+" "+numoT+" "+oT)
            if(st[i].indexOf(']')==2){
                if(numoT==0)return false;
                if("/"+oT[numoT]==st[i].substring(0,2))
                    numoT--;
                else
                    return false;
            }else if(st[i].indexOf(']')==1){
                oT[++numoT] = st[i].substring(0,1);
            }else return false;
        }
    }
    return true;
}
</script>
Avatar billede roenving Novice
07. december 2003 - 21:23 #37
Jeg tror zq den er der !-)

Absolut ikke stress-testet, men prøv engang !-)

<script language="javascript" type="text/javascript">
function testTags(fld){
    var oT = new Array();
    var numoT = 0, slut = slut1 = slut2 = 0;
    var st = fld.value.split('[');
    if(st.length>1){
        for(i=1;st.length>i;i++){
            alert(st[i]+" "+numoT+" "+oT);
            if(st[i].indexOf('/')==0&&st[i].indexOf(']')>1){
                if(numoT==0)return false;
                if(st[i].indexOf("/"+oT[numoT])==0)
                    numoT--;
                else
                    return false;
            }else if(st[i].indexOf(']')>0){
                if(st[i].indexOf('image')!=0){
                    slut1 = st[i].indexOf(']');
                    slut2 = st[i].indexOf('=');
                    slut = (slut1>slut2&&slut2!=-1)?slut2:slut1;
                    oT[++numoT] = st[i].substring(0,slut);
                }
            }else return false;
        }
    }
    return true;
}
</script>
Avatar billede ducks Nybegynder
07. december 2003 - 21:24 #38
Skal jeg bare smide den i <form onSubmit="return testTags()"> ?
Avatar billede ducks Nybegynder
07. december 2003 - 21:28 #39
<form onSubmit"return testTags(document.answer.message)">?

Ved hej får jeg b]hej 0 og så validerer den :\
Avatar billede ducks Nybegynder
07. december 2003 - 21:33 #40
Ved hej ikke noget
Avatar billede roenving Novice
07. december 2003 - 21:37 #41
Der er en alert-meddelelse, jeg har brugt til debug, slet den eller sæt // foran den ...

Men jeg har ikke stress-testet den, men de resultater, præcis den alert viste, tyder på, at den fungerer !-)

og det er den rigtige syntaks du har i 21:28:42 ...
Avatar billede ducks Nybegynder
07. december 2003 - 21:44 #42
Problemet er at, hvis jeg kun skriver [b]noget tekst, skifter den også side.
Avatar billede roenving Novice
07. december 2003 - 21:48 #43
Arh, den havde jeg ikke tænkt på !-)

Prøv at ændre de sidste linjer til:

    if(numoT==0)return true;
}
</script>

-- så vil den heller ikke acceptere det !-)
Avatar billede ducks Nybegynder
07. december 2003 - 21:58 #44
Nu ser det ud til at virke :)
Avatar billede ducks Nybegynder
07. december 2003 - 21:58 #45
Vis altså det var mening at den sørger for at der er ligeså mange [ som ] og ikke fx som
Avatar billede roenving Novice
07. december 2003 - 22:05 #46
Den checker altid for, om der findes et ] efter et [, fordi det er en nødvendig forudsætning for at komme videre, men der checkes ikke for om der står et b] et eller andet sted ...

-- og den kigger både efter at der kommer lige mange [x] som [/x], samt at der evt. står og ikke ...
Avatar billede ducks Nybegynder
07. december 2003 - 22:12 #47
Så virker den ikke ved:
test
test
[i]test[i]test
[/i]

Altså den fortsætter bare til næste side :(
Avatar billede roenving Novice
07. december 2003 - 22:15 #48
Den accepterer den altså ikke hos mig ?-)

-- men den accepterer

test
test
test[i]test[/i]

-- men der er vel grænser for hvad du skal checke ...
Avatar billede ducks Nybegynder
07. december 2003 - 22:22 #49
Det er sq fint nok... Hvor finder jeg en liste med simple javascript kommandoer, jeg synes ik at der er så mange på w3schools? Fx at finde tegnet til venstre i en tekst..
Avatar billede roenving Novice
07. december 2003 - 22:32 #50
-- jeg kunne forøvrigt finde ud af at sikre at de samme tags ikke godkendes inde i hinanden, men det betyder altså også at man ikke kan sætte tables inde i tables !-)

<script language="javascript" type="text/javascript">
function testTags(fld){
    var oT = new Array();
    var numoT = 0, slut = slut1 = slut2 = 0;
    var st = fld.value.split('[');
    if(st.length>1){
        for(i=1;st.length>i;i++){
            alert(st[i]+" "+numoT+" "+oT);
            if(st[i].indexOf('/')==0&&st[i].indexOf(']')>1){
                if(numoT==0)return false;
                if(st[i].indexOf("/"+oT[numoT])==0)
                    numoT--;
                else
                    return false;
            }else if(st[i].indexOf(']')>0){
                if(st[i].indexOf('image')!=0){
                    slut1 = st[i].indexOf(']');
                    slut2 = st[i].indexOf('=');
                    slut = (slut1>slut2&&slut2!=-1)?slut2:slut1;
                    oT[++numoT] = st[i].substring(0,slut);
                    if(oT[numoT-1]==oT[numoT])return false;
                }
            }else return false;
        }
    }
    if(numoT==0)return true;
}
</script>

-- og den bedste reference jeg kender (men også ekstrem omfattende !-) er:

http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/

-- og der findes sikkert også en 1.5 !o]
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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