2010-04-07 2 views
1

Je veux ignorer compter la longueur des caractères dans le texte s'il y a des codes spéciaux à l'intérieur de textarea. Je ne veux pas compter les caractères spéciaux dans le texte. J'utilise des codes spéciaux pour définir les smileys d'entrée dans le texte. Je veux compter seulement la longueur du texte en ignorant le code spécial.JavaScript: compte la longueur minimale des caractères dans le texte, en ignorant les codes spéciaux à l'intérieur

Voici mon code approximatif j'ai essayé d'écrire, mais ne peut pas le laisser travailler:

// smileys 
// ======= 

function smileys(){ 

var smile = new Array(); 

smile[0] = "[:rolleyes:]"; 
smile[1] = "[:D]"; 
smile[2] = "[:blink:]"; 
smile[3] = "[:unsure:]"; 
smile[4] = "[8)]"; 
smile[5] = "[:-x]"; 

return(smile); 
} 

// symbols length limitation 
// ========================= 

function minSymbols(field){ 

var get_smile = smileys(); 
var text = field.value; 

for(var i=0; i<get_smile.length; i++){ 
for(var j=0; j<(text.length); j++){ 
if(get_smile[i]==text[j]){ 
text = field.value.replace(get_smile[i],""); 
} 
} 
} 

if(text.length < 50){ 
document.getElementById("saveB").disabled=true; 
} else { 
document.getElementById("saveB").disabled=false; 
} 
} 

Comment le script doit être pour le laisser travailler? Je vous remercie!

Répondre

1
function minSymbols(field){ 
    var get_smile = smileys(); 
    var text = field.value; 

    for(var i=0; i<get_smile.length; i++){ 
     text = text.replace(get_smile[i],""); 
    } 
} 
+1

Merci, Ivo Sabev! C'était la chose dont j'avais besoin! Fonctionne parfaitement! :-) – ilnur777

0
function getTxtLen() 
{ 
    var str=document.getElementById('myTxtBox').value; 

     str=str.replace(/\[:some:\]/g,''); 
     str=str.replace(/\[:some2:\]/g,''); 

     alert(str.length); 
} 
+0

Pas la chose, j'ai besoin. Je vous remercie! – ilnur777

2

Je commencerai par changer la façon dont je définir les smileys:

var smilies = [ 
    {text: "[:rolleyes:]", exp: /\[\:rolleyes\:\]/g}, 
    {text: "[:D]",   exp: /\[\:D\]/g}, 
    {text: "[:blink:]", exp: /\[\:blink\:\]/g}, 
    {text: "[:unsure:]", exp: /\[\:unsure\:\]/g}, 
    {text: "[8)]",   exp: /\[8\)\]/g}, 
    {text: "[:-x]",  exp: /\[\:-x\]/g} 
]; 

(je n'ai pas vu immédiatement quelque raison que ce devait être une fonction, mais vous pouvez le faire un si vous voulez.) C'est un tableau d'objets, chaque objet ayant une propriété text avec le texte de smiley et un objet exp avec un RegExp qui le ferait correspondre (avec le drapeau global défini).

la fonction alors un peu comme ceci:

function getLengthMinusSmilies(field) { 
    var text, index, length, smiley; 

    text = field.value; 
    length = text.length; 
    for (index = 0; index < smilies.length; ++index) { 
     smiley = smilies[index]; 
     while (smiley.exp.test(text)) { 
      length -= smiley.text.length; 
     } 
    } 
    return length; 
} 

Cela évite de créer et de jeter des chaînes temporaires. Il ne fait que compter les allumettes de smileys et ne tient pas compte de leur longueur.

Vous ne devez pas utiliser des objets avec text et exp valeurs, vous pouvez utiliser des tableaux de Paralle si vous aimez:

var smilies = [ 
    "[:rolleyes:]", 
    "[:D]", 
    "[:blink:]", 
    "[:unsure:]", 
    "[8)]", 
    "[:-x]" 
]; 

var matchExps = [ 
    /\[\:rolleyes\:\]/g, 
    /\[\:D\]/g, 
    /\[\:blink\:\]/g, 
    /\[\:unsure\:\]/g, 
    /\[8\)\]/g, 
    /\[\:-x\]/g 
]; 

... puis ajuster la boucle dans la fonction en conséquence. Utiliser un tableau avec des objets a tendance à être plus maintenable, mais si vous avez besoin d'un tableau ailleurs ...

+0

T.J. Crowder, votre exemple change toute la structure de mon script. Je pourrais l'utiliser dans d'autres solutions. Mais donc merci du tout! ;-) – ilnur777

+0

@ ilnur777: Oui, c'était un peu radical. :-) Bonne chance! –

Questions connexes