Я работаю в CMS, которая позволяет пользователям вводить контент. Проблема в том, что когда они добавляют символы ®
, они могут плохо отображаться во всех браузерах. Я хотел бы создать список символов, которые необходимо найти, а затем преобразовать в соответствующий объект html. Например
® => ®
& => &
© => ©
™ =>™
После преобразования его нужно обернуть в <sup>
тег, в результате чего получится :
®
=> <sup>®</sup>
Поскольку необходим определенный размер шрифта и стиль заполнения:
sup { font-size: 0.6em; padding-top: 0.2em; }
Будет ли JavaScript что-то вроде этого?
var regs = document.querySelectorAll('®');
for ( var i = 0, l = imgs.length; i < l; ++i ) {
var [?] = regs[i];
var [?] = document.createElement('sup');
img.parentNode.insertBefore([?]);
div.appendChild([?]);
}
Где «[?]» Означает, что есть что-то, в чем я не уверен.
Дополнительные детали:
- Я бы хотел сделать это на чистом JavaScript, а не на том, что требует библиотеки вроде jQuery, спасибо.
- Бэкэнд - это Ruby
- Использование RefineryCMS, созданного на Ruby on Rails
javascript
html
Дж. Галлардо
источник
источник
accept-charset="UTF-8"
в свой<form>
тег. На сервере вы хотите убедиться, что ваш вывод закодирован в UTF-8, и что ваш веб-сервер сообщает браузеру, что это так (черезContent-Type
заголовок). См. Rentzsch.tumblr.com/post/9133498042/… Если вы все это сделаете, а браузер не отображает символ правильно, то замена символа сущностью не будет иметь никакого значения.sup
элементы обычно вызывает больше проблем, чем может решить, поскольку во многих шрифтах «®» имеет маленький размер и находится в нижнем индексе, поэтому вы уменьшите его до неузнаваемости.<sup>
не является проблемой, так как я тестировал определенные шрифты, используемые для сообщений в блоге, но это хороший момент, который следует учитывать.Ответы:
Вы можете использовать регулярное выражение для замены любого символа в заданном диапазоне Unicode его эквивалентом сущности html. Код будет выглядеть примерно так:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) { return '&#'+i.charCodeAt(0)+';'; });
Этот код будет заменить все символы в заданном диапазоне (Юникод 00A0 - 9999, а также амперсанд, больше и меньше) с их эквивалентами сущностей HTML, который просто
&#nnn;
гдеnnn
это значение Юникода мы получаем изcharCodeAt
.Посмотрите здесь в действии: http://jsfiddle.net/E3EqX/13/ (в этом примере используется jQuery для селекторов элементов, используемых в примере. Сам базовый код, приведенный выше, не использует jQuery)
Выполнение этих преобразований не решает всех проблем - убедитесь, что вы используете кодировку символов UTF8, убедитесь, что ваша база данных хранит строки в UTF8. Ты все еще можете видеть случаи, когда символы отображаются неправильно, в зависимости от конфигурации системного шрифта и других проблем, находящихся вне вашего контроля.
Документация
String.charCodeAt
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAtисточник
.js
файл и добавить другие элементы, которые нужно обернуть с помощью<sup>
?sup
тег (или любой другой тег), и он содержится в функции: jsfiddle.net/E3EqX/4 . Чтобы использовать это, вам нужно скопировать функцию encodeAndWrap в свой проект.В принятом на данный момент ответе есть несколько проблем. Этот пост объясняет их и предлагает более надежное решение. Решение, предложенное в этом ответе, ранее имело:
var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) { return '&#' + i.charCodeAt(0) + ';'; });
Этот
i
флаг является избыточным, поскольку ни один символ Юникода в диапазоне от U + 00A0 до U + 9999 не имеет варианта верхнего / нижнего регистра, выходящего за пределы того же диапазона.m
Флаг является излишним , поскольку^
или$
не используется в регулярном выражении.Почему диапазон от U + 00A0 до U + 9999? Это кажется произвольным.
В любом случае, для решения, которое правильно кодирует все, кроме безопасных и печатаемых символов ASCII на входе (включая астральные символы!), И реализует все именованные ссылки на символы (не только в HTML4), используйте библиотеку he (отказ от ответственности: эта библиотека принадлежит мне ). Из README:
Также см. Этот соответствующий ответ о переполнении стека .
источник
У меня была такая же проблема, и я создал 2 функции для создания сущностей и преобразования их обратно в обычные символы. Следующие методы преобразуют любую строку в сущности HTML и обратно в прототип String.
/** * Convert a string to HTML entities */ String.prototype.toHtmlEntities = function() { return this.replace(/./gm, function(s) { // return "&#" + s.charCodeAt(0) + ";"; return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";"; }); }; /** * Create string from HTML entities */ String.fromHtmlEntities = function(string) { return (string+"").replace(/&#\d+;/gm,function(s) { return String.fromCharCode(s.match(/\d+/gm)[0]); }) };
Затем вы можете использовать его следующим образом:
var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en tést".toHtmlEntities(); console.log("Entities:", str); console.log("String:", String.fromHtmlEntities(str));
Вывод в консоль:
Entities: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést
источник
m
модификатора шаблона в шаблоне без привязок. Значит, вы хотите использоватьs
узор, содержащий точку?Без какой-либо библиотеки, если вам не нужна поддержка IE <9, вы можете создать элемент html и установить его содержимое с помощью Node.textContent :
var str = "<this is not a tag>"; var p = document.createElement("p"); p.textContent = str; var converted = p.innerHTML;
Вот пример: https://jsfiddle.net/1erdhehv/
источник
Вы можете использовать это.
var escapeChars = { '¢' : 'cent', '£' : 'pound', '¥' : 'yen', '€': 'euro', '©' :'copy', '®' : 'reg', '<' : 'lt', '>' : 'gt', '"' : 'quot', '&' : 'amp', '\'' : '#39' }; var regexString = '['; for(var key in escapeChars) { regexString += key; } regexString += ']'; var regex = new RegExp( regexString, 'g'); function escapeHTML(str) { return str.replace(regex, function(m) { return '&' + escapeChars[m] + ';'; }); };
https://github.com/epeli/underscore.string/blob/master/escapeHTML.js
var htmlEntities = { nbsp: ' ', cent: '¢', pound: '£', yen: '¥', euro: '€', copy: '©', reg: '®', lt: '<', gt: '>', quot: '"', amp: '&', apos: '\'' }; function unescapeHTML(str) { return str.replace(/\&([^;]+);/g, function (entity, entityCode) { var match; if (entityCode in htmlEntities) { return htmlEntities[entityCode]; /*eslint no-cond-assign: 0*/ } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) { return String.fromCharCode(parseInt(match[1], 16)); /*eslint no-cond-assign: 0*/ } else if (match = entityCode.match(/^#(\d+)$/)) { return String.fromCharCode(~~match[1]); } else { return entity; } }); };
источник
Если вы хотите избежать кодирования html-сущностей более одного раза
function encodeHTML(str){ return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) { if(char !== '&' || next !== '#'){ if(/[\u00A0-\u9999<>&]/.test(next)) next = '&#' + next.charCodeAt(0) + ';'; return '&#' + char.charCodeAt(0) + ';' + next; } return full; }); } function decodeHTML(str){ return str.replace(/&#([0-9]+);/g, function(full, int) { return String.fromCharCode(parseInt(int)); }); }
# Пример
var text = "<a>Content © <#>&<&#># </a>"; text = encodeHTML(text); console.log("Encode 1 times: " + text); // <a>Content © <#>&<&#># </a> text = encodeHTML(text); console.log("Encode 2 times: " + text); // <a>Content © <#>&<&#># </a> text = decodeHTML(text); console.log("Decoded: " + text); // <a>Content © <#>&<&#># </a>
источник
<#>
будет выглядеть как<#>
Специальные символы HTML и их
ESCAPE CODES
Зарезервированные символы должны быть экранированы с помощью HTML: мы можем использовать экранирование символа для представления любого символа Юникода [Пример: & - U + 00026] в HTML, XHTML или XML, используя только символы ASCII. Ссылки на числовые символы [ Пример: амперсанд (&) -
&
] & Ссылки на именованные символы [Пример:&
] являются типамиcharacter escape used in markup
.Предопределенные объекты
Для отображения HTML - теги в качестве нормальной формы в веб - страницы , мы используем
<pre>
,<code>
теги или мы можем избежать их. Экранирование строки путем замены любым вхождением"&"
символа в строке"&"
и любых вхождений">"
символа в строке">"
. Пример:stackoverflow post
function escapeCharEntities() { var map = { "&": "&", "<": "<", ">": ">", "\"": """, "'": "'" }; return map; } var mapkeys = '', mapvalues = ''; var html = { encodeRex : function () { return new RegExp(mapkeys, 'g'); // "[&<>"']" }, decodeRex : function () { return new RegExp(mapvalues, 'g'); // "(&|<|>|"|')" }, encodeMap : JSON.parse( JSON.stringify( escapeCharEntities () ) ), // json = {&: "&", <: "<", >: ">", ": """, ': "'"} decodeMap : JSON.parse( JSON.stringify( swapJsonKeyValues( escapeCharEntities () ) ) ), encode : function ( str ) { var encodeRexs = html.encodeRex(); console.log('Encode Rex: ', encodeRexs); // /[&<>"']/gm return str.replace(encodeRexs, function(m) { console.log('Encode M: ', m); return html.encodeMap[m]; }); // m = < " > SpecialChars }, decode : function ( str ) { var decodeRexs = html.decodeRex(); console.log('Decode Rex: ', decodeRexs); // /(&|<|>|"|')/g return str.replace(decodeRexs, function(m) { console.log('Decode M: ', m); return html.decodeMap[m]; }); // m = < " > } }; function swapJsonKeyValues ( json ) { var count = Object.keys( json ).length; var obj = {}; var keys = '[', val = '(', keysCount = 1; for(var key in json) { if ( json.hasOwnProperty( key ) ) { obj[ json[ key ] ] = key; keys += key; if( keysCount < count ) { val += json[ key ]+'|'; } else { val += json[ key ]; } keysCount++; } } keys += ']'; val += ')'; console.log( keys, ' == ', val); mapkeys = keys; mapvalues = val; return obj; } console.log('Encode: ', html.encode('<input type="password" name="password" value=""/>') ); console.log('Decode: ', html.decode(html.encode('<input type="password" name="password" value=""/>')) ); O/P: Encode: <input type="password" name="password" value=""/> Decode: <input type="password" name="password" value=""/>
источник
m
содержит специальные символы входной строки.var htmlEntities = [ {regex:/&/g,entity:'&'}, {regex:/>/g,entity:'>'}, {regex:/</g,entity:'<'}, {regex:/"/g,entity:'"'}, {regex:/á/g,entity:'á'}, {regex:/é/g,entity:'é'}, {regex:/í/g,entity:'í'}, {regex:/ó/g,entity:'ó'}, {regex:/ú/g,entity:'ú'} ]; total = <some string value> for(v in htmlEntities){ total = total.replace(htmlEntities[v].regex, htmlEntities[v].entity); }
Решение массива
источник
Если вы уже используете jQuery, попробуйте
html()
.$('<div>').text('<script>alert("gotcha!")</script>').html() // "<script>alert("gotcha!")</script>"
Текстовый узел в памяти создается и
html()
вызывается на нем.Это уродливо, тратит впустую немного памяти, и я понятия не имею, так ли обстоятельно, как что-то вроде
he
библиотеки, но если вы уже используете jQuery, возможно, это вариант для вас.Взято из сообщения в блоге. Кодируйте объекты HTML с помощью jQuery, автор Феликс Гейзендорфер.
источник
var converter=$("<div>");
и позже использовать его повторно:html1=converter.text(text1).html(); html2=converter.text(text2).html();
...Иногда вы просто хотите закодировать каждый символ ... Эта функция заменяет «все, кроме ничего» в regxp.
function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
Показать фрагмент кода
function encode(w) { return w.replace(/[^]/g, function(w) { return "&#" + w.charCodeAt(0) + ";"; }); } test.value=encode(document.body.innerHTML.trim());
<textarea id=test rows=11 cols=55>www.WHAK.com</textarea>
источник
^
на ,.
чтобы сохранить смайлики:function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
.Ознакомьтесь с руководством на сайте Ourcodeworld Ourcodeworld - кодируйте и декодируйте объекты HTML с помощью javascript
Самое главное, что библиотека пример
he.encode('foo © bar ≠ baz ???? qux'); // → 'foo © bar ≠ baz 𝌆 qux' // Passing an `options` object to `encode`, to explicitly encode all symbols: he.encode('foo © bar ≠ baz ???? qux', { 'encodeEverything': true }); he.decode('foo © bar ≠ baz 𝌆 qux'); // → 'foo © bar ≠ baz ???? qux'
Эта библиотека, вероятно, упростит ваше кодирование и сделает его более управляемым. Он популярен, регулярно обновляется и соответствует спецификации HTML. Сам он не имеет зависимостей, как это видно в package.json.
источник
Вот как я реализовал кодировку. Я черпал вдохновение из приведенных выше ответов.
function encodeHTML(str) { const code = { ' ' : ' ', '¢' : '¢', '£' : '£', '¥' : '¥', '€' : '€', '©' : '©', '®' : '®', '<' : '<', '>' : '>', '"' : '"', '&' : '&', '\'' : ''' }; return str.replace(/[\u00A0-\u9999<>\&''""]/gm, (i)=>code[i]); } // TEST console.log(encodeHTML("Dolce & Gabbana")); console.log(encodeHTML("Hamburgers < Pizza < Tacos")); console.log(encodeHTML("Sixty > twelve")); console.log(encodeHTML('Stuff in "quotation marks"')); console.log(encodeHTML("Schindler's List")); console.log(encodeHTML("<>"));
источник
m
модификатора шаблона в шаблоне без привязок.Вы можете использовать этот
charCodeAt()
метод, чтобы проверить, имеет ли указанный символ значение выше 127, и преобразовать его в ссылку на числовой символ с помощьюtoString(16)
.источник
127
и о том, как / почему это работает;)replaceHtmlEntities(text) { var tagsToReplace = { '&': '&', '<': '<', '>': '>', }; var newtext = text; for (var tag in tagsToReplace) { if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) { var regex = new RegExp(tag, 'g'); newtext = newtext.replace(regex, tagsToReplace[tag]); } } return newtext; }
источник
<!DOCTYPE html> <html> <style> button { backround: #ccc; padding: 14px; width: 400px; font-size: 32px; } #demo { font-size: 20px; font-family: Arial; font-weight: bold; } </style> <body> <p>Click the button to decode.</p> <button onclick="entitycode()">Html Code</button> <p id="demo"></p> <script> function entitycode() { var uri = "quotation = ark __ ' = apostrophe __ & = ampersand __ < = less-than __ > = greater-than __ non- = reaking space __ ¡ = inverted exclamation mark __ ¢ = cent __ £ = pound __ ¤ = currency __ ¥ = yen __ ¦ = broken vertical bar __ § = section __ ¨ = spacing diaeresis __ © = copyright __ ª = feminine ordinal indicator __ « = angle quotation mark (left) __ ¬ = negation __ ­ = soft hyphen __ ® = registered trademark __ ¯ = spacing macron __ ° = degree __ ± = plus-or-minus __ ² = superscript 2 __ ³ = superscript 3 __ ´ = spacing acute __ µ = micro __ ¶ = paragraph __ · = middle dot __ ¸ = spacing cedilla __ ¹ = superscript 1 __ º = masculine ordinal indicator __ » = angle quotation mark (right) __ ¼ = fraction 1/4 __ ½ = fraction 1/2 __ ¾ = fraction 3/4 __ ¿ = inverted question mark __ × = multiplication __ ÷ = division __ À = capital a, grave accent __ Á = capital a, acute accent __ Â = capital a, circumflex accent __ Ã = capital a, tilde __ Ä = capital a, umlaut mark __ Å = capital a, ring __ Æ = capital ae __ Ç = capital c, cedilla __ È = capital e, grave accent __ É = capital e, acute accent __ Ê = capital e, circumflex accent __ Ë = capital e, umlaut mark __ Ì = capital i, grave accent __ Í = capital i, acute accent __ Î = capital i, circumflex accent __ Ï = capital i, umlaut mark __ Ð = capital eth, Icelandic __ Ñ = capital n, tilde __ Ò = capital o, grave accent __ Ó = capital o, acute accent __ Ô = capital o, circumflex accent __ Õ = capital o, tilde __ Ö = capital o, umlaut mark __ Ø = capital o, slash __ Ù = capital u, grave accent __ Ú = capital u, acute accent __ Û = capital u, circumflex accent __ Ü = capital u, umlaut mark __ Ý = capital y, acute accent __ Þ = capital THORN, Icelandic __ ß = small sharp s, German __ à = small a, grave accent __ á = small a, acute accent __ â = small a, circumflex accent __ ã = small a, tilde __ ä = small a, umlaut mark __ å = small a, ring __ æ = small ae __ ç = small c, cedilla __ è = small e, grave accent __ é = small e, acute accent __ ê = small e, circumflex accent __ ë = small e, umlaut mark __ ì = small i, grave accent __ í = small i, acute accent __ î = small i, circumflex accent __ ï = small i, umlaut mark __ ð = small eth, Icelandic __ ñ = small n, tilde __ ò = small o, grave accent __ ó = small o, acute accent __ ô = small o, circumflex accent __ õ = small o, tilde __ ö = small o, umlaut mark __ ø = small o, slash __ ù = small u, grave accent __ ú = small u, acute accent __ û = small u, circumflex accent __ ü = small u, umlaut mark __ ý = small y, acute accent __ þ = small thorn, Icelandic __ ÿ = small y, umlaut mark"; var enc = encodeURI(uri); var dec = decodeURI(enc); var res = dec; document.getElementById("demo").innerHTML = res; } </script> </body> </html>
источник