【发布时间】:2011-01-24 23:06:09
【问题描述】:
我需要确定可能包含 html-entities 的字符串的长度。
例如“↓” (↓) 将返回长度 6,这是正确的,但我希望这些实体仅计为 1 个字符。
【问题讨论】:
我需要确定可能包含 html-entities 的字符串的长度。
例如“↓” (↓) 将返回长度 6,这是正确的,但我希望这些实体仅计为 1 个字符。
【问题讨论】:
<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;
}
【讨论】:
.val 或换行符引起的。
由于目前还没有使用 jQuery 的解决方案:
var str = 'lol&';
alert($('<span />').html(str).text().length); // alerts 4
使用与 karim79 相同的方法,但它从不将创建的元素添加到文档中。
【讨论】:
在大多数情况下,您可以假设一个字符后跟一个字符,或者一个可能的“#”和数字,后跟一个分号。
var strlen=string.replace(/&#?[a-zA-Z0-9]+;/g,' ').length;
【讨论】:
如果您在浏览器中运行 javascript,我建议您使用它来帮助您。您可以创建一个元素并将其 innerHTML 设置为包含 HTML 实体的字符串。然后将您刚刚创建的那个元素的内容提取为文本。
这是一个示例(使用 Mootools):http://jsfiddle.net/mqchen/H73EV/
【讨论】:
不幸的是,JavaScript 本身并不支持 HTML 实体的编码或解码,这是您需要做的才能获得“真正的”字符串长度。我能够找到这个能够解码和编码 HTML 实体的第三方库,并且它似乎运行良好,但无法保证它会是多么完整。
【讨论】:
使用 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() 的工作方式不同。
【讨论】: