22. marts 2004 - 22:25Der 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++ }
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
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 ?
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 }
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 }
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)
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 ...
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 '!' ?
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]
Synes godt om
Ny brugerNybegynder
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.