2011-01-24 4 views

ответ

11
<div id="foo">&darr;</div> 

alert(document.getElementById("foo").innerHTML.length); // alerts 1 

Так на основе этого обоснования, создать DIV, добавьте ваш перепутали объект охваченной строки к нему, извлекать HTML и проверьте длину.

var div = document.createElement("div"); 
div.innerHTML = "&darr;&darr;&darr;&darr;"; 
alert(div.innerHTML.length); // alerts 4 

Try it here.

Вы можете положить, что в функции для удобства, например:

function realLength(str) { // maybe there's a better name? 
    var el = document.createElement("div"); 
    el.innerHTML = str; 
    return el.innerHTML.length; 
} 
+3

Интригующее решение. –

+0

Я [модифицировал скрипку] (http://jsfiddle.net/e89hJ/1/) и протестировал это решение против входов и выходов в библиотечном решении, которое я разместил, и была некоторая несогласованность. А именно, я ввел кодированный вход и получил 110 символов, затем ввел декодированный ввод одних и тех же данных и получил 96 символов. Не знаю, почему именно, но, возможно, стоит проверить. –

+0

@Nathan Taylor - Несогласованность может быть вызвана '.val' jQuery или разрывами строк. – karim79

0

К сожалению, JavaScript изначально не поддерживает кодирование или декодирование HTML сущностей, что и вам нужно будет сделать, чтобы получить «реальную» длину строки. Я смог найти эту стороннюю библиотеку, которая способна декодировать и кодировать HTML-объекты, и, похоже, она работает достаточно хорошо, но нет гарантии, что будет заполнен.

http://www.strictly-software.com/htmlencode

3

Поскольку нет никакого решения, используя JQuery еще:

var str = 'lol&amp;'; 
alert($('<span />').html(str).text().length); // alerts 4 

использует тот же подход, как karim79, но он никогда не добавляет созданный элемент в документе.

+2

Возможно, мне что-то не хватает, но ответ karim не добавляет элемент в документ. –

+0

Hrm ok, похоже, что я только прочитал половину его ответа (или он отредактировал его) – ThiefMaster

1

Если вы используете javascript в браузере, я бы предложил использовать его, чтобы помочь вам. Вы можете создать элемент и установить его innerHTML как свою строку, содержащую HTML-сущности. Затем извлеките содержимое этого элемента, который вы только что создали в виде текста.

Вот пример (использует Mootools): http://jsfiddle.net/mqchen/H73EV/

2

Вы могли бы для большинства целей предполагать, что амперсанд следуют письма, или возможного «#» и числами, следует точка с запятой, является один символ.

var strlen=string.replace(/&#?[a-zA-Z0-9]+;/g,' ').length; 
Смежные вопросы