Avatar billede dingemann Novice
22. marts 2004 - 22:25 Der er 23 kommentarer og
1 løsning

optælinng af ord

føglende:

<Script Language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
wordcounter=0;
o = 0
    for (i = 0; i < field.value.length; i++) {
        if (field.value.charAt(i) == ".") {
            o++
        }       
       
        if (field.value.charAt(i) == " " && field.value.charAt(i-1) != " ")  {
            wordcounter++
        }
        countfield.value = wordcounter + 1 + ", " + o
    }
}

</Script>

optæller antal ord og punktummer i en tekstbox. Men mangler at finde ud af hvor mange ord der fx er længere end 5 bogstaver og så fx udskrive det som en forlængelse af countfield.value = wordcounter + 1 + ", " + o - fx som countfield.value = wordcounter + 1 + ", " + o + ", " + [antal ord der er længere end 5 bogstaver]


Nogle bud? ved ikke helt hvad der går galt for mig men jeg gir op :D
Avatar billede skovenborg Nybegynder
22. marts 2004 - 22:38 #1
for at tælle ord kan du vel bare skrive:

var re = new RegExp("\w{"+antalchars+"}","gm");
antal_ord = field.value.match(re).length;

(ikke testet og tæller ikke punktummer som ord)
Avatar billede roenving Novice
22. marts 2004 - 22:38 #2
<script type="text/javascript" language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
var wordcounter=longwords=o=0;
  reg = /\./g;
  o = field.value.match(reg).length;
  reg = /\s/g;
  wordcounter = field.value.split(reg).length;
  reg = /\w{6,}/gi;
  longwords = field.value.match(reg).length;
  countfield.value = wordcounter + ", " + longwords ", " + o
}

</script>

\w medtager også _ og tal, så hvis du ikke vil have dem med skal de mulige medregnes !-)
Avatar billede roenving Novice
22. marts 2004 - 22:43 #3
-- og så måske et par småforbedringer (bl.a. inspireret af skovenborgs !-)

<script type="text/javascript" language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
var wordcounter=longwords=o=0;
  reg = /\.\s/gm;
  o = field.value.match(reg).length;
  reg = /\s+/gm;
  wordcounter = field.value.split(reg).length;
  reg = /\w{6,}/gim;
  longwords = field.value.match(reg).length;
  countfield.value = wordcounter + ", " + longwords ", " + o
}

</script>
Avatar billede skovenborg Nybegynder
22. marts 2004 - 22:59 #4
ja, men glem min løsning - den var vist temmelig langt hen i vejret (virker i hvert fald ikke).
Avatar billede dingemann Novice
22. marts 2004 - 23:31 #5
jeg kan ikke få java-klumpen til at fungere :D hvad med for-løkken ? og de if-sætninger jeg havde lavet... kan du ikke putte den ind i min oprindelige ?
Avatar billede helle_fred Nybegynder
23. marts 2004 - 10:25 #6
function ordTaeller(field, countfield, maxlimit) {
wordcounter=0;
punkt= 0
longwords=0
peg=""
prev=""
antal=0
    for (i = 0; i < field.value.length; i++) {
    peg=field.value.charAt(i)
        if (peg == ".") {
            punkt++; if(antal>maxlimit) longwords=longwords+1; antal=0
        }else     
       
        if (peg == " " && prev != " ")  {
            wordcounter++;if(antal>maxlimit) longwords=longwords+1; antal=0
        } else
    antal=antal+1
    prev=peg
     
    }
if(antal>maxlimit)longwords=longwords+1
countfield.value = "ord:"+(wordcounter + 1) + ", punktummer:  " + punkt +", lo:"+longwords
}
Avatar billede helle_fred Nybegynder
23. marts 2004 - 11:02 #7
<Script Language = "JavaScript">

function ordTaeller(field, countfield, maxlimit) {
  antalord= punktummer= langeord=ordlaengde=0
  peg=prev=""
  for (i = 0; i < field.value.length; i++) {
      peg=field.value.charAt(i)
      if (peg == ".") {
        punktummer++; if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      }else     
      if (peg == " " && prev != " ")  {
        antalord++;if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      } else
      ordlaengde++
      prev=peg
  }
  if(ordlaengde>maxlimit)langeord++
  countfield.value = "Ord: "+(antalord + 1) + "\nPunktummer:  " + punktummer +
  "\nOrd over "+maxlimit+": "+langeord
}

</Script>
Avatar billede roenving Novice
23. marts 2004 - 14:11 #8
Den fungerer helt perfekt, når jeg prøver den ?-)

Jeg bruger jo godt nok nogle fiduser, som helt overflødiggør løkker, derfor er de der ikke !-)

Ved _meget_ lange tekster vil du også opleve, at den måde at gøre det på er betydelig hurtigere ...

-- men jeg kan da forklare metoden (som kræver, at man bruger NS4+, IE4+ eller en anden nyere browser !-)

Regular expressions, som er udgangspunktet, er en måde at genkende (og udskifte) teksstrenge i andre tekststrenge med en hel masse special-karakterer, som jeg her gør kraftigt brug af:

Først laver jeg en søgestreng med et punktum (\.) og en eller anden whitespace (\s) da der jo altid er en eller anden form for afstand efter et sætningspunktum (f.eks. i modsætning til en tusindtal-separator).

.match, som jeg bruger til sammenligningen returnerer et array af de tekststrenge, som matcher, hvorfor jeg blot aflæser længden, så har jeg antallet af sætningspunktummer.

Næste søgestreng er bare en eller flere whitespaces (\s+) da der altid vil være den slags imellem ord.

Her bruger jeg så split til at opdele teksten i et array, som jeg så læser længden på !-)

I den sidste søgestreng bruger jeg mindst 6 ordtegn (\w{6,}), og bruger match på samme måde, og tæller antallet af matches.

\w er dog lidt tricky, da den er afhængig af locale, men alternativet er at skrive _alle_ de tegn op, som man anser som lovlige, og det bliver på dansk en meget lang liste:

[a-zæøåÆØÅäÄàÀáÁëËêÊéÉèÈöÖüÜ]{6,}

Whitespace er alle forskellige muligheder for at andre tegn bliver adskilt, så det er både mellemrum, tabuleringer, nylinje og linjestart.

Ved nærmere eftertanke skal man måske tilføje et check for om det allersidste tegn er et punktum, og hvis det er det tillægge een til sætningstallet.

-- og så bliver det:

<script type="text/javascript" language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
  var wordcounter=longwords=o=0,val=field.value;
  reg = /\.\s/gm;
  o = val.match(reg).length + (val.substring(val.length-1)==".")?1:0;
  reg = /\s+/gm;
  wordcounter = field.value.split(reg).length;
  reg = /\[a-zæøåÆØÅäÄàÀáÁëËêÊéÉèÈöÖüÜ]{6,}/gim;
  longwords = field.value.match(reg).length;
  countfield.value = wordcounter + ", " + longwords ", " + o
}

</script>
Avatar billede roenving Novice
23. marts 2004 - 14:14 #9
Hov, en lille fejl (og et par manglende men ubetydelige konsekvensrettelser !-)

<script type="text/javascript" language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
  var wordcounter=longwords=o=0,val=field.value;
  reg = /\.\s/gm;
  o = val.match(reg).length + (val.substring(val.length-1)==".")?1:0;
  reg = /\s+/gm;
  wordcounter = val.split(reg).length;
  reg = /[a-zæøåÆØÅäÄàÀáÁëËêÊéÉèÈöÖüÜ]{6,}/gim;
  longwords = val.match(reg).length;
  countfield.value = wordcounter + ", " + longwords ", " + o
}

</script>
Avatar billede roenving Novice
23. marts 2004 - 14:16 #10
-- og så kan man diskutere om ñÑ er lovlige, men vi skriver dem i hvert fald oftest, hvis de er skrevet på original-sproget ...
Avatar billede helle_fred Nybegynder
23. marts 2004 - 14:24 #11
roenving:

i linjen
countfield.value = wordcounter + ", " + longwords ", " + o

mangler du et plus - efter "longwords - men så kører den også.
Avatar billede helle_fred Nybegynder
23. marts 2004 - 14:31 #12
roenving: du får også et problem, hvis der kommer en sætning uden punktum - l. 21: "val,match(reg)has no property"
Avatar billede roenving Novice
23. marts 2004 - 14:46 #13
>>helle_fred

Det har du da ret i !-)

Den havde jeg glemt at medtænke, for jeg havde vel bare tankerne ovre i, at man ville lave en lix-beregning af en tekst, og den havde jeg ikke tænkt i, kunne være een sætning !o]

<script type="text/javascript" language = "JavaScript">
function ordTaeller(field, countfield, maxlimit) {
  var wordcounter=longwords=o=0,val=field.value;
  reg = /\.\s/gm;
  o = ((val.match(reg))?val.match(reg).length:0) + (val.substring(val.length-1)==".")?1:0;
  reg = /\s+/gm;
  wordcounter = val.split(reg).length;
  reg = /[a-zæøåÆØÅäÄàÀáÁëËêÊéÉèÈöÖüÜñÑ]{6,}/gim;
  longwords = val.match(reg).length;
  countfield.value = wordcounter + ", " + longwords + ", " + o
}

</script>
Avatar billede helle_fred Nybegynder
23. marts 2004 - 14:57 #14
Roenving - nu får du fejlen i linje 25 - der bruger du også val.match(reg).
Avatar billede roenving Novice
23. marts 2004 - 15:17 #15
Nu har jeg prøvet den onchange på et tekstarea, som er tomt, så den fejl kan ikke opstå !-)
Avatar billede helle_fred Nybegynder
23. marts 2004 - 15:26 #16
longwords = val.match(reg).length;

giver problemer
Avatar billede helle_fred Nybegynder
23. marts 2004 - 15:33 #17
- skal vel være: if (val.match(reg)) longwords = val.match(reg).length;
?
Avatar billede helle_fred Nybegynder
23. marts 2004 - 15:36 #18
Det er selvfølgelig en dum detalje - men den tomme tekst optælles som wordcounter=1 :-O
Avatar billede roenving Novice
23. marts 2004 - 15:49 #19
>>helle_fred @ 15:26:40 & 15:33:48

Det er selvfølgelig muligt at have en tekst uden et eneste ord, som er på 6 eller flere bogstaver, så ja, den kan vi vel også bruge !-)
Avatar billede dingemann Novice
23. marts 2004 - 23:16 #20
<Script Language = "JavaScript">

function ordTaeller(field, countfield, maxlimit) {
  antalord= punktummer= langeord=ordlaengde=0
  peg=prev=""
  for (i = 0; i < field.value.length; i++) {
      peg=field.value.charAt(i)
      if (peg == ".") {
        punktummer++; if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      }else     
      if (peg == " " && prev != " ")  {
        antalord++;if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      } else
      ordlaengde++
      prev=peg
  }
  if(ordlaengde>maxlimit)langeord++
  countfield.value = "Ord: "+(antalord + 1) + "\nPunktummer:  " + punktummer +
  "\nOrd over "+maxlimit+": "+langeord
}

</Script>

^---- fungere jo godt :D men gider du fortælle mig hvorfor der ikke skal { efter nogle af if-sætningerne - (hint: jeg er liiidt ny i Java - kommer fra vbscript)
Avatar billede roenving Novice
23. marts 2004 - 23:33 #21
Ja, da !o]

Jeg forsøgte bare at finde en løsning, som undlader itereringerne (i script-koden !-), da de kan tage en betragtelig tid ved længere tekster ...

Og mht. dit spørgsmål om {}, er javascript i almindelig notation grundlæggende linje-baseret, så har man en løkke, vil den næste kommando være omfattet af den, men skal man have mere end en kommando i løkken er man nødt til at afgrænse den med tuborg ...

Eksempelvis er den linje, som i helle_freds eksempel hedder

  prev=peg

ikke en del af if-konstruktionen, den vil blive udført uanset hvilken forgrening koden har været rundt om, hvorimod den foregående linje (ordlaengde++) kun bliver udført, hvis ingen af de andre ifs er blevet udført ...

At det gør det svært at gennemskue, får mig ofte til at bruge redundante {}er, men da man heller ikke behøver at afslutte linjer med ; men kan gøre det (og skal gøre det ved adskillelse af flere kommandoer på samme linje !-) er det mere et spørgsmål om programmeringsstil ...
Avatar billede dingemann Novice
24. marts 2004 - 15:56 #22
okay men det vil sige sig at:

<Script Language = "JavaScript">

function ordTaeller(field, countfield, maxlimit) {
  antalord= punktummer= langeord=ordlaengde=0
  peg=prev=""
  for (i = 0; i < field.value.length; i++) {
      peg=field.value.charAt(i)
      if (peg == ".") {
        punktummer++; if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      }else     
      if (peg == " " && prev != " ")  {
        antalord++;if(ordlaengde>maxlimit) langeord++; ordlaengde=0
      } else
      ordlaengde++
      prev=peg
  }
  if(ordlaengde>maxlimit)langeord++
  countfield.value = "Ord: "+(antalord + 1) + "\nPunktummer:  " + punktummer +
  "\nOrd over "+maxlimit+": "+langeord
}

</Script>

kan omskrives så der kommer { de steder hvor det er logisk istedet for ?

i såfald er jeg villig til at dele point (yderligere) til dig hvis du gider og indsætte { og } - vil gerne kunne se det lidt mere overskueligt - hvilket jeg pt ikke syntes det er :D - og til sidst: hvad betyder '!' ?
Avatar billede dingemann Novice
24. marts 2004 - 15:56 #23
first part done :D
Avatar billede roenving Novice
24. marts 2004 - 17:04 #24
Jeg kunne finde på at skrive det sådan:

<script type="text/javascript" language="JavaScript">

function ordTaeller(field, countfield, maxlimit) {
  antalord= punktummer= langeord=ordlaengde=0;
  peg=prev="";
  for (i = 0; i < field.value.length; i++){
      peg=field.value.charAt(i);
      if (peg == "."){
        punktummer++;
        if(ordlaengde>maxlimit){
          langeord++;
        }
        ordlaengde=0;
      }else if (peg == " " && prev != " "){
        antalord++;
        if(ordlaengde>maxlimit){
          langeord++;
        }
        ordlaengde=0;
      } else ordlaengde++
      prev=peg
  }
  if(ordlaengde>maxlimit)langeord++
  countfield.value = "Ord: "+(antalord + 1) + "\nPunktummer:  " + punktummer +
  "\nOrd over "+maxlimit+": "+langeord
}

</script>

-- men jeg bliver usikker på, hvordan den virker, når man sådan skriver den ud ...

-- og en hurtig beregning vil vise, at du script-mæssigt initierer en hulens masse iterationer fra script, hvor den løsning, jeg har lagt, ikke har een eneste ...

-- der er selvføgelig iterationer indbygget, men et forsigtigt slag på tasken vil give en faktor 100 eller 1000 på den hastighed de bliver udført med, når de er kodet i javascript-fortolkeren !-)

-- og ! betyder logisk 'ikke' i sammenlignings-operatorer altså er != ikke lig med, forskellig fra !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