7.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von halfstone Profi (18.1k Punkte)
Hallo liebe JavaScript Profis,

ich brauche für unsere Webseite ein JavaScript mit folgender Funktion:

Eine Webseite hat in einem Formular zwei Texteingabefelder.
Im ersten werden Wörter eingetragen, in jede Zeile eines, Beispiel:

-------------------
Fabian
Hugo
Susi
Markus
-------------------

Wenn ich jetzt im nächsten Texteingabefeld einen Text schreibe, dann soll am besten oben angezeigt werden welche dieser Worte ich schon im Text benutzt habe und wie oft.

------------------
Fabian hat sich heute in die Sonne gelegt und dabei Susi getroffen.
Beide sind dann zusammen Eis essen gegangen und Susi hat dabei noch ihren Hund mitgenommen.
------------------

Dann soll im oberen Textfenster angezeigt werden wie oft die jeweiligen Wörter im unteren Text benutzt wurden also so:

-------------------
Fabian 1
Hugo
Susi 2
Markus
-------------------

Die Aktualisierung würde bei jedem Punkt am Ende eines Satzes reichen, kann aber auch bei jedem Space passieren.

Richtig super wäre auch noch eine zweite Zahl hinter der Anzahl nämlich die Wortdichte die sich aus der Gesamtzahl der Wörter durch die Anzahl der Vorkommen eines Wortes ergibt.

Ich hoffe ich habe mich verständlich ausgedrückt.

Viele Grüße und ein sonniges Wochenende wünsche ich euch

Fabian

38 Antworten

0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi,

ich nochmal, ich weiß jetzt leider immer noch nicht wie ich die in Antwort 17 beschriebenen Zeichenketten los werde (xx%) wäre super wenn mir da noch jemand helfen könnte.

Viele Grüße

Fabian
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi ich nochmal,

also ich hab immer noch das Problem mit den Prozenten (Antwort 17), die rausgeschnitten werden sollen, ein kleiner Hilfestubs würde mich sehr freuen.

Gruß Fabian
0 Punkte
Beantwortet von
wenn ich das Codegewurschtel richtig deute musst du in dieser Zeile

strResult += '<span style="color:'+color+';">'+matchPhrases[i]+': '+count+' ('+pct.toFixed(2)+'%)</span><br>';


einfach qwegnehmen, was nicht gebraucht wird.

Also zB. so:

strResult += '<span style="color:'+color+';">'+matchPhrases[i]+': '+count+'</span><br>';


Da deine Problembeschreibung nicht ganz zum Code passt kann ich dazu nicht mehr sagen.
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi gast42,

in der von dir beschriebenen Zeile geht es ja um die Ausgabe der Ergebnisse, das ist nicht das wo ich die Prozente rausnehmen will sondern in der Eingabe.

Also da wo man die Liste der Worte eingibt, die gezählt werden sollen, diese Liste ist wie in Antwort 17 beschrieben formatiert und muss entsprechend umgewandelt werden bevor angefangen wird die Wörter zu zählen:

Das kopiere ich in die Liste der Wörter die zu zählen sind

94% speedtest
88% anbieter
85% speed
82% test

und eigentlich soll nur das hier ausgewertet werden:

speedtest
anbieter
sped
test

also wie oft das jeweilige Wort ohne die Prozentangabe davor im Text vorkommt.

Gruß Fabian
0 Punkte
Beantwortet von
aha!

dann versuch folgendes:

Die Daten werden hier eingelesen:

for(var i=0;i<matchPhrases.length;i++) {
matchExpressions[i] = new RegExp('\\\s'+matchPhrases[i]+'\\\s','gi');
}
(Zeile 44-46)

mache daraus

for(var i=0;i<matchPhrases.length;i++) {
var bla=matchPhrases[i].split(" ");
if (bla.length>1) matchPhrases[i]=bla[1];
matchExpressions[i] = new RegExp('\\\s'+matchPhrases[i]+'\\\s','gi');
}
0 Punkte
Beantwortet von friedel Experte (3.3k Punkte)
Dann kann man nicht mehr nach Ausdrücken suchen, die aus mehreren Wörtern bestehen.

Ich habe auf die Schnelle mal das hier gemacht:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wortzaehler</title>
<script type="text/javascript">
var matchPhrases = null;
var matchExpressions = null;

function wordcount(src,evt) {
if (window.event) evt = window.event;
if (!evt.charCode) evt.charCode = evt.keyCode;
if ( (evt.charCode == 10) || (evt.charCode == 13) || (evt.charCode == 32) ) {
var wordCount = 0;
var tmp = src.value.replace(/(^\s+|\s+$)/,'').replace(/[.;-?=!, \r\n\t]+/gi,' ');
wordCount = tmp.split(' ').length;
document.getElementById('wordCount').innerHTML = wordCount;
if (matchPhrases) {
var strResult = '';
var pct;
var count;
tmp = ' '+tmp+' ';
for(var i=0;i<matchPhrases.length;i++) {
var found = tmp.match(matchExpressions[i]);
if (found) {
count = found.length;
} else {
count = 0;
};
pct = (count*100)/wordCount;
if ( (pct==0) || (pct>12) ) color = 'red';
else if (pct >= 7) color = 'green';
else if (pct > 0) color = 'yellow';
strResult += '<span style="color:'+color+';">'+matchPhrases[i]+': '+count+' ('+pct.toFixed(2)+'%)</span><br>';
}
document.getElementById('phraseCount').innerHTML = strResult;
};
};
};

function prepare(src) {
matchPhrases = src.value.replace(/\r\n/g,'\n').split("\n");
for(i=0;i<matchPhrases.length;i++){
matchPhrases[i] = matchPhrases[i].replace(/^\d+%/, "");
};
matchExpressions = new Array(matchPhrases.length);
for(var i=0;i<matchPhrases.length;i++) {
matchExpressions[i] = new RegExp('\\\s'+matchPhrases[i]+'\\\s','gi');
};
};
</script>
</head>
<body onload="prepare(document.getElementById('wordlist'));">
<form action="#" method="POST" onsubmit="return false;">

<div id="phraseCount" style="border:1px solid black;padding:4px;position:relative;">Warte auf Eingabe&hellip;
</div>
<label for="wordlist">Zu zählende Worte oder Phrasen</label><br>
<textarea id="wordlist" name="wordlist" rows="8" cols="40" onblur="prepare(this);"></textarea><br>
<br>
<label for="text">Text</label> <span id="wordCount"></span><br>

<textarea id="text" name="text" rows="10" cols="60"
onkeypress="wordcount(this,event);"></textarea>
</form>
</body>
</html>


Damit wird in jeder Zeile in der Wordlist die eine Folge von beliebig vielen Ziffern, dem Prozentzeichen und einem Whitespacezeichen (z.B. ein Leerzeichen) am Zeilenanfang ignoriert.
0 Punkte
Beantwortet von
mag sein, wäre aber reparabel gewesen.

Ich find den ganzen Code eh Mist, denn mein Firefox steigt dauernd aus, so dass ich Testläufe immer mit der nicht ganz so guten Fehlerkonsole des Opera machen musste.
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi Friedel,

deine Lösung funktioniert leider nicht, die Zeichen werden nicht rausgefiltert und daher auch die Worte danach nicht gezählt wenn sie nicht mit der Zahl und dem Prozentzeichen auftauchen.

@gast42,

habe das von dir gewünschte ausgetauscht und das hat bei mir auch nicht funktioniert.

Mal ein anderer Lösungsansatz, gibts nicht eine einfache Funktion die einfach die ersten 4 Zeichen der jeweiligen Zeile löscht und das dann verlgeicht, vielleicht schon beim reinkopieren oder per Button, damit man sich das überlegen kann ob es passt, das wäre doch sicher einfach zu machen.

Gruß Fabian
0 Punkte
Beantwortet von
bei mir hat's funktioniert im Opera. Hast du's richtig einkopiert? Hier im Thread hast du schon mal nicht funktionierende Verbesserungsvorschläge bemängelt (A8+10) und dabei einfach nur falsch ausgetauscht.

Um ehrlich zu sein mag ich nicht weiter an diesem schrottigen Code rumdoktern. War nur'n Versuch. Bye!
0 Punkte
Beantwortet von friedel Experte (3.3k Punkte)
In welchem Browser hast du es denn probiert. Im FF funktioniert der Quellcode, den du gepostet hast, schon nicht. Was ich ergänzt habe, müsste eigentlich in jedem Browser funktionieren, in dem der Rest funktioniert. Getestet habe ich nur im IE6.Da funktioniert es.
...