JavaScript: считайте минимальную длину символов в тексте, игнорируя специальные коды внутри - PullRequest
1 голос
/ 07 апреля 2010

Я хочу игнорировать подсчет длины символов в тексте, если внутри textarea есть специальные коды. Я имею в виду не считать специальные коды символов в тексте. Я использую специальные коды для определения ввода смайликов в тексте. Я хочу считать только длину текста, игнорируя специальный код.

Вот мой примерный код, который я пытался написать, но не могу заставить его работать:

// 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;
}
}

Каким должен быть сценарий, чтобы он работал? Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 апреля 2010

Я бы начал с изменения способа определения смайликов:

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}
];

(я не сразу понял, почему это должна быть функция, но вы можете сделать ее, если хотите.) Это массив объектов, каждый из которых имеет свойство text с текстом смайлика и объект exp с RegExp, который соответствует ему (с установленным глобальным флагом).

Затем функция ищетпримерно так:

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;
}

Это позволяет избежать создания и отбрасывания временных строк.Он просто считает совпадения смайликов и не учитывает их длину.

Вам не нужно использовать объекты со значениями text и exp, вы можете использовать параллельные массивы, если вам нравится:

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

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

... и затем соответственно отрегулируйте цикл в функции.Использование одного массива с объектами имеет тенденцию быть более легким в обслуживании, но если вам нужен массив в другом месте ...

1 голос
/ 07 апреля 2010
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],"");
    }
}
0 голосов
/ 07 апреля 2010
function getTxtLen()
{
    var str=document.getElementById('myTxtBox').value;

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

        alert(str.length);
}
...