javascript - شرح - أسرع طريقة للهروب من علامات HTML على هيئة كيانات HTML؟




regular expression شرح (6)

أسرع طريقة هي:

function escapeHTML(html) {
    return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
}

هذه الطريقة أسرع مرتين من الطرق التي تعتمد على "استبدال" ، راجع http://jsperf.com/htmlencoderegex/35 .

المصدر: https://stackoverflow.com/a/17546215/698168

أكتب لك إضافة Chrome تتضمن القيام بالكثير من المهام التالية: تعقيم السلاسل التي قد تحتوي على علامات HTML ، عن طريق تحويل < ، > & &lt; &gt; و &amp; على التوالى

(وبعبارة أخرى ، نفس php's htmlspecialchars(str, ENT_NOQUOTES) - لا أعتقد أن هناك أي حاجة حقيقية لتحويل الأحرف المزدوجة الاقتباس.)

هذه هي أسرع وظيفة وجدتها حتى الآن:

function safe_tags(str) {
    return str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;') ;
}

ولكن لا يزال هناك فارق كبير عندما أضطر إلى تشغيل بضعة آلاف من السلاسل عبرها دفعة واحدة.

يمكن لأي شخص تحسين على هذا؟ إنها في الغالب لسلاسل تتكون من 10 إلى 150 حرفًا ، إذا كان ذلك يُحدث فرقًا.

(فكرة واحدة لم تكن عناء تكذيب أكبر من الإشارة - هل سيكون هناك أي خطر حقيقي في ذلك؟)


إليك طريقة واحدة يمكنك القيام بها:

var escape = document.createElement('textarea');
function escapeHTML(html) {
    escape.textContent = html;
    return escape.innerHTML;
}

function unescapeHTML(html) {
    escape.innerHTML = html;
    return escape.textContent;
}

وهنا عرض.



طريقة Martijn كوظيفة واحدة مع معالجة " علامة ( تستخدم في javascript ):

function escapeHTML(html) {
    var fn=function(tag) {
        var charsToReplace = {
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            '"': '&#34;'
        };
        return charsToReplace[tag] || tag;
    }
    return html.replace(/[&<>"]/g, fn);
}

يحتوي الكود المصدري AngularJS أيضًا على إصدار داخل angular-sanitize.js .

var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
    // Match everything outside of normal chars and " (quote character)
    NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
/**
 * Escapes all potentially dangerous characters, so that the
 * resulting string can be safely inserted into attribute or
 * element text.
 * @param value
 * @returns {string} escaped text
 */
function encodeEntities(value) {
  return value.
    replace(/&/g, '&amp;').
    replace(SURROGATE_PAIR_REGEXP, function(value) {
      var hi = value.charCodeAt(0);
      var low = value.charCodeAt(1);
      return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
    }).
    replace(NON_ALPHANUMERIC_REGEXP, function(value) {
      return '&#' + value.charCodeAt(0) + ';';
    }).
    replace(/</g, '&lt;').
    replace(/>/g, '&gt;');
}

يمكنك محاولة تمرير وظيفة رد اتصال لإجراء الاستبدال:

var tagsToReplace = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;'
};

function replaceTag(tag) {
    return tagsToReplace[tag] || tag;
}

function safe_tags_replace(str) {
    return str.replace(/[&<>]/g, replaceTag);
}

في ما يلي اختبار أداء: http://jsperf.com/encode-html-entities للمقارنة مع استدعاء وظيفة replace بشكل متكرر ، واستخدام طريقة DOM التي اقترحها Dmitrij.

طريقك يبدو أسرع

لماذا تحتاجها ، على الرغم من؟





string