我需要确定可能包含html-entities的字符串的长度。
例如“& darr;” (↓)将返回长度6,这是正确的,但我希望这些实体只计为1个字符。
答案 0 :(得分:11)
<div id="foo">↓</div>
alert(document.getElementById("foo").innerHTML.length); // alerts 1
因此,基于该理由,创建一个div,将混合的实体隐藏字符串附加到其中,提取HTML并检查长度。
var div = document.createElement("div");
div.innerHTML = "↓↓↓↓";
alert(div.innerHTML.length); // alerts 4
您可能希望将其放在函数中以方便使用,例如:
function realLength(str) { // maybe there's a better name?
var el = document.createElement("div");
el.innerHTML = str;
return el.innerHTML.length;
}
答案 1 :(得分:3)
由于还没有使用jQuery的解决方案:
var str = 'lol&';
alert($('<span />').html(str).text().length); // alerts 4
使用与karim79相同的方法,但它永远不会将创建的元素添加到文档中。
答案 2 :(得分:3)
你可以在大多数情况下假设一个&符号后跟字母,或者一个可能的'#'和数字,后跟一个分号,是一个字符。
var strlen=string.replace(/&#?[a-zA-Z0-9]+;/g,' ').length;
答案 3 :(得分:1)
如果您在浏览器中运行javascript,我建议您使用它来帮助您。您可以创建一个元素并将其innerHTML设置为包含HTML实体的字符串。然后将刚刚创建的元素的内容提取为文本。
以下是一个示例(使用Mootools):http://jsfiddle.net/mqchen/H73EV/
答案 4 :(得分:0)
不幸的是,JavaScript本身并不支持HTML实体的编码或解码,这是获取“真实”字符串长度所需要做的事情。我能够找到这个能够对HTML实体进行解码和编码的第三方库,它似乎运行得很好,但不能保证完成将如何。
答案 5 :(得分:0)
使用 ES6(引入 codePointAt()
:
function strlen (str) {
let sl = str.length
let chars = sl
for (i = 0; i < sl; i++) if (str.codePointAt(i) > 65535) {
chars--;
i++;
}
return chars
}
注意 charCodeAt()
的工作方式不同。