Zeichen in Textarea zählen
Oli
- javascript
0 Oli0 Michael0 MudGuard
Hallo ihr Lieben,
ich möchte in einer Textarea die eingegebenen Zeichen zählen. Dazu habe ich das folgende Skript gefunden. Läuft so weit auch ganz gut, Problem ist nur, dass der Zeilenumbrüche nicht mitzählt. Nun bin ich eine ziemliche Null was Javascript angeht. Dürfte doch nur eine kleine Änderung sein, die \n auch mitzuzählen. Wer kann mir helfen, wie das geht?
function textlimit(Obj,maxcount,counter){
function c_len(){
if(this.value.length > this.maxcount && this.maxcount != 0){
return false;
}
update_count(this);
}
function upd_count(){
update_count(this);
}
function update_count(elem){
if(elem.counter != null){
cnt = getObj(elem.counter);
cnt.innerHTML = elem.value.length
}
}
function check(){
if (this.value.length > this.maxcount && this.maxcount != 0){
this.value = this.value.substr(0,this.maxcount);
}
update_count(this);
}
Obj.counter = counter;
Obj.maxcount = maxcount;
Obj.onkeypress= c_len;
Obj.onkeydown = upd_count;
Obj.onkeyup = check;
Obj.onfocus = check;
Obj.onblur = check;
Obj.onmouseup = check;
update_count(Obj);
function getObj( ref ) {
if( document.getElementById( ref ) != null ){ //W3C
return document.getElementById(ref);
}
else if(document.all[ref]!=null){ //IE5
return document.all[ ref ];
}
else if( document.layers[ ref ] != null ){ //NN4
return document.layers[ref];
}
else{ //ERR
alert('Object "'+ref+'" not Found')
}
}
}
Habe mich gerade nochmal etwas damit befasst und muss meine Aussage von vorhin korrigieren. Der zählt einen Zeilenumbruch schon mit, aber nur als ein Zeichen. PHP und MySQL scheinen das als zwei Zeichen zu zählen (wohl wegen des \n). Mein Problem bleibt aber eigentlich gleich. Ich muss die Zeilenumbrüche als zwei Zeichen zählen (bzw. so wie MySQL).
Moin!
Habe mich gerade nochmal etwas damit befasst und muss meine Aussage von vorhin korrigieren. Der zählt einen Zeilenumbruch schon mit, aber nur als ein Zeichen. PHP und MySQL scheinen das als zwei Zeichen zu zählen (wohl wegen des \n). Mein Problem bleibt aber eigentlich gleich. Ich muss die Zeilenumbrüche als zwei Zeichen zählen (bzw. so wie MySQL).
Nein, die Zählweise ist schon korrekt. Wenn deine Textarea lediglich ein Linefeed ("/n" steht für das ASCII-Zeichen #10) zählt, dann wird auch nur ein Zeichen an dein Skript gesendet. Und da PHP nur gesendete Zeichen weiterverarbeitet, aber keine zusätzlichen Zeichen generiert, werden nur die eingegebenen Zeilenumbrüche nach MySQL gelangen.
Der Punkt ist: Du weißt nicht genau, was PHP und MySQL veranstalten - deshalb wäre es eine gute Idee, wenn du das einfach mal konkret nachprüfst, was die machen.
Oder du erzählst hier mal genauer, was du für ein Problem lösen willst.
- Sven Rautenberg
Ich habe eine Textarea, in der Daten eingegeben werden sollen, die in einem MySQL varchar(255) Feld abgespeichert werden. Wenn ich genau 255 Zeichen (mit Javascript gezählt) eingebe, speichert er die genau so in der Datenbank. Habe ich bei diesen 255 Zeichen aber Leerzeilen, schneidet mir MySQL genau die Anzahl Zeichen hinten ab, die ich Leerzeilen im Text habe. PHP zählt ebenfalls bei einem Text mit 250 Zeichen und 5 Zeilenumbrüchen 260 Zeichen.
Moin!
Ich habe eine Textarea, in der Daten eingegeben werden sollen, die in einem MySQL varchar(255) Feld abgespeichert werden. Wenn ich genau 255 Zeichen (mit Javascript gezählt) eingebe, speichert er die genau so in der Datenbank. Habe ich bei diesen 255 Zeichen aber Leerzeilen, schneidet mir MySQL genau die Anzahl Zeichen hinten ab, die ich Leerzeilen im Text habe. PHP zählt ebenfalls bei einem Text mit 250 Zeichen und 5 Zeilenumbrüchen 260 Zeichen.
Wie und wann zählst du in PHP die Zeichen, und wie speicherst du in die Datenbank? Kannst du feststellen, welche Strings und welche Bytes darin dein PHP erhält und versucht in die Datenbank zu schreiben?
- Sven Rautenberg
Im PHP habe ich einfach mal versuchsweise strlen($_POST[textfeld]) ausgegeben. Und da gibt er mir bei diesem String:
aaaaa
bbbbb
ccccc
ddddd
eeeee
33 aus. Im Javascript zählt er 29. Demnach ja meine Vermutung, Javascript zählt Zeilenumbrüche als eins, PHP/MySQL als zwei.
Moin!
Im PHP habe ich einfach mal versuchsweise strlen($_POST[textfeld]) ausgegeben. Und da gibt er mir bei diesem String:
aaaaa
bbbbb
ccccc
ddddd
eeeee
33 aus. Im Javascript zählt er 29. Demnach ja meine Vermutung, Javascript zählt Zeilenumbrüche als eins, PHP/MySQL als zwei.
Dann konvertiere doch grundsätzlich alle die diversen Zeilenumbrüche, die du empfangen kannst (Mac = /r, DOS = /r/n, Unix = /n) in ein einheitliches Format (Unix = /n) - und schon hast du damit eigentlich keine Probleme mehr.
- Sven Rautenberg
Hallo Sven.
Dann konvertiere doch grundsätzlich alle die diversen Zeilenumbrüche, die du empfangen kannst (Mac = /r, DOS = /r/n, Unix = /n) in ein einheitliches Format (Unix = /n) - und schon hast du damit eigentlich keine Probleme mehr.
Beim ersten Male hielt ich es noch für einen Tippfehler, aber nun bin ich mir nicht mehr so sicher.
Du meinst eigentlich „\n“ und „\r“, nicht mit Slash sondern mit Backslash.
Einen schönen Mittwoch noch.
Gruß, Ashura
Tatsächlich, wenn ich ein
preg_replace("(\r\n|\r)", "\n", $_POST[textfeld])
mache funktioniert es. Beide sagen 29 Zeichen. Vielen Dank für den Tipp! Ist aber doof, dass Windows da zwei Zeichen für den Umbruch setzt...
Hallo Oli.
Tatsächlich, wenn ich ein
preg_replace("(\r\n|\r)", "\n", $_POST[textfeld])
Hier genügt aber vollkommen str_replace. Als erstes Argument übergibst du diesem einen Array mit den beiden Zeilenumbruchtypen.
Einen schönen Mittwoch noch.
Gruß, Ashura
Ok, der Performance wegen. Hast Recht, danke dir.
Was mir bei diesem Thema kürzlich aufgefallen ist:
Unter Windows zählen IE und Opera den Zeilenumbruch im Textarea als zwei Zeichen, Firefox aber nur als ein Zeichen.
Nach dem absenden, kommt beim PHP-Skript aber bei allen drei das selbe an.
Hi,
Unter Windows zählen IE und Opera den Zeilenumbruch im Textarea als zwei Zeichen, Firefox aber nur als ein Zeichen.
Was browserintern geschieht, dürfte dem Browser überlassen sein.
Nach dem absenden, kommt beim PHP-Skript aber bei allen drei das selbe an.
Klar - HTML schreibt vor, daß für Zeilenumbrüche Carriage Return und Linefeed gesendet werden muß:
Line breaks are represented as "CR LF" pairs (i.e., %0D%0A'). bzw. As with all MIME transmissions, "CR LF" (i.e.,
%0D%0A') is used to separate lines of data.
Siehe http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4
cu,
Andreas