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 poste nochmal den Quelltext von Supermax hier.
Katy ich habs in verschiedenen Versionen nochmal getestet kann aber die Stelle nicht genau finden wo ich was zu viel gelöscht habe.

Hier der code von Supermax:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<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");
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><br>
</form>
</body>
</html>


Vielen Dank schon mal an alle die mitgeholfen haben

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

wie könnte man aus der Wortliste noch folgende Zeichen rausfiltern:

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

so dass nur noch:

speedtest
anbieter
sped
test

getestet werden, aber weiterhin auch mehrere Worte in einer Zeile?

Die Daten würden immer mit zwei oder einstelligen Prozentangaben vor dem Wort kommen.

Gruß Fabian
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Auf jeden Fall bin ich schon mal über die Lösungen hier begeistert!!!

Super, freue mich

Gruß Fabian
0 Punkte
Beantwortet von katy Mitglied (787 Punkte)
Hi Fabian,

ich weiß jetzt nicht, von welcher Lösung du begeistert bist, habe aber kein Lust, mir hier angesichts dieser zweigleisigkeit unnütz den Kopf zu zerbrechen und ziehe mich daher aus dem Thread zurück.

katy
0 Punkte
Beantwortet von friedel Experte (3.3k Punkte)
Hallo Fabian

Zuerst mal ein Hinweis: Du postest hier Quelltexte, in denen du sehr übersichtliche Einrückungen gemacht hast. Allerdings hast du diese Einrückungen durch ein Gemisch aus Tabulatoren und Leerzeichen realisiert. Übersichtlich ist es natürlich nur, wenn dein Editor einen Tabulator so breit darstellt, wie der Editor desjenigen, der das ganze dann versucht weiter zu bearbeiten. Offensichtlich ist bei dir ein Tabulator 3 Leerzeichen breit. Wenn ich den Quellcode kopiere und in meinen Editor kopiere, ist es schon wesentlich weniger übersichtlich, denn bei mir ist ein Tabulator nur 2 Leerzeichen breit. Wenn bei 2 aufeinander folgenden Zeilen die erste mit 6 Leerzeichen eingerückt ist und die 2. mit 2 Tabulatoren, sind bei dir beide Zeilen gleich weit eingerückt, bei mir ist die obere Zeile deutlich weiter eingerückt. Du solltest. um das zu vermeiden, entweder immer nur mit Tabulatoren einrücken, oder immer nur mit Leerzeichen einrücken, nie beides mischen.

Ich habe ihn mir bisher nur oberflächlich angesehen und weiß noch nicht, ob ich heute noch Zeit habe, um mic genauer damit zu befassen. Aber ein paar Sachen sind mir gleich aufgefallen.

Dein Quellcode enthält einen Fehler. In deiner extralangen Zeile benutzt du innerhalb von einem String die Zeichenfolge "</span>". Das geht nicht. Der Slash muss in einem String immer maskiert werden. Du musst "</span>" also durch "<\/span>" ersetzen.

Dein Formular enthält ein Div-Element, ein Label-Element, dann ein br-Element, dann eine Textarea , dann 2 mal br, wieder Label, span, br, textarea und br. Das, was im Fettdruck hervorgehoben habe, sind alles Inlineelemente. In Formularen sind in der Variante "Transitional" auch Inlineelemente erlaubt, in der Variante "Strict" nicht. Ich würde die Inlineelemete in Blockelemente einbauen, wie es sich gehört. aber es ist auch so erlaubt. Aber der merkwürdige Einsatz von br-Elementen, den du benutzt ist natürlich auch in der Variante Transitional nicht sinnvoll. ein br-Element ist ein Zeilenumbruch. Der hat nur da etwas zu suchen, wo auch eine Ziele steht, die man umbrechen kann. Unmittelbar vor dem Formularende oder 2 mal hintereinander macht sowas sicher gar keinen Sinn.

In deinem letzten Posting (Antwort 13) fragst du, dass du aus der Wortliste noch "folgende" Zeichen ausfiltern willst. Aber was du genau ausfiltern willst, schreibst du nicht. In Zeilen mit mehreren Zeichenketten, die durch Leerzeichen getrennt sind, soll jeweils die erste Zeichenkette nicht beachtet werden? Oder es sollen keine Zeichenfolgen berücksichtigt werden, die Ziffern enthalten? Oder keine Zeichenfolgen, die das Prozentzeichen enthalten? Oder es sollen Folgen ausgefiltert werden, die mit Ziffern anfangen? Oder welche, die mit dem Prozentzeichen aufhören? Oder vielleicht nur explizit die Ausdrücke "94% ", "88% ", "85% " und "82% "? Oder vielleicht nur explizit beim Ausdruck "94% speedtest" die Zeichenfolge "94% " usw.? Wenn du eindeutig formulierst, was gemacht werden soll, ist es wahrscheinlich auch nicht schwer, das in eine Scriptsprache zu übersetzen.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Die Verantwortung für Fehler im Quellcode übernehme ich, ich verwende immer Tabs zur Einrückung und habe auch alole Editoren die ich verwende (unter Windows PSPad, unter Linux vi) so eingestellt, daß ein Tab genau 3 Zeichen entspricht.

Daß der HTML-Code nicht unbedingt 100% valide ist und vieles auf HTML-Ebene anders/besser gelöst werden könnte will ich gar nicht bestreiten. Aber hier ging es ja vorrangig um die JavaScript-Lösung, das Formular steht nur zu Testzwecken da. Ich weiß auch daß man einen DOCTYPE-Prolog nur setzen sollte, wenn der folgende HTML-Code auch dem angegeben DOCTYPE entspricht. Aber ich habe hier einfach ein bestehendes HTML-Grundgerüst kopiert. Asche auf mein Haupt ;)

In einem irrst du dich allerdings: in keiner mir bekannten Programmiersprache muß der normale Schrägstrich in einem Zeichenkettenliteral escaped werden, nur der Backslash da dieser jedenfall in den syntaktisch an C angelehnten Programmiersprachen eine besondere Bedeutung hat.
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi,

und vielen Dank noch mal an alle, die mitmachen.

@Kati, der Code von Supermax, macht ziemlich genau das was ich wollte, deiner auch aber da weiß ich nicht genau was ich ersetzen soll.

@Friedel, ich weiß nicht genau was an Antwort 12 unverständlich sein soll, da stehen Prozentangaben, die weggefilter werden sollen.
Die Daten würden immer mit zwei oder einstelligen Prozentangaben vor dem Wort kommen.


Also gibt es Wortlisten bei denen jeweils unterschiedliche Prozentangaben vor dem eigentlichen Wort stehen, die dann weggefiltert werden sollen.

Nochmal ein Beispiel:

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

so dass nur noch:

speedtest
anbieter
sped
test

oder aus:

9% speedtest
86% anbieter
22% speed
4% test

soll das hier werden:

speedtest
anbieter
sped
test

Gruß Fabian
0 Punkte
Beantwortet von
Friedel wie er leibt und lebt,

wenn du nicht helfen willst dann schreib doch einfach nichts, aber diese Haarspalterei von dir ist wirklich lähmend.

halfstone hat es doch sogar für so Leute wie dich genau erklärt sogar mit Beispiel, also mit Bildern zum angucken so dass es jeder kapiert.

cu haarspalter
0 Punkte
Beantwortet von
@Supermax:
in der Zeichenkombination </ muss der Slash escaped werden, da sonst der HTML-Tagsoup-Parser dies als Scriptende interpretieren könnte. das hat also nichts mit der Programmiersprache JavaScript zu tun sondern mit HTML. In XHTML darfst du solche Zeichenkombinationen deswegen gar nicht mehr in Inline-Scripten verwenden.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
@gast42: Wieder was dazugelernt, danke für die "Aufklärung" ;) Normalerweise würde ich diese Funktionen ja ohnehin in eine externe .js-Datei auslagern und diese per <script src=.... einbinden.
...