Я бы начал с изменения способа определения смайликов:
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
];
... и затем соответственно отрегулируйте цикл в функции.Использование одного массива с объектами имеет тенденцию быть более легким в обслуживании, но если вам нужен массив в другом месте ...