Как сделать правильную строку для XML в JavaScript?

Я ищу функцию для преобразования строки в строку XML с сущностями XML, где это необходимо. Что-то вроде htmlentities в PHP, но для XML и в Javascript.

Спасибо за любую помощь!

1 ответ

Решение

Там нет ничего встроенного (кроме innerHTML сериализация, которая для этой цели очень сложна), вам придется написать ее самостоятельно, например:

function encodeXml(s) {
    return (s
        .replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''')
        .replace(/</g, '&lt;').replace(/>/g, '&gt;')
        .replace(/\t/g, '&#x9;').replace(/\n/g, '&#xA;').replace(/\r/g, '&#xD;')
    );
}

Это максималистская экранирующая функция для безопасности:

  • это всегда будет кодировать ", ' и символы табуляции /CR/LF, хотя они должны быть экранированы только в значении атрибута, где этот конкретный символ кавычки используется в качестве разделителя.

  • это всегда будет кодировать > хотя это только на самом деле нужно избежать, когда часть ]]> последовательность в текстовом содержании.

Если вам не нужны эти свойства, вы можете удалить replaceS вам не нужно (например, довольно редко нужно указывать tab/CR/LF в значении атрибута).

Если вам нужно создать HTML-совместимый XHTML, используйте &#39; вместо &apos; если тебе нужен этот побег.

В общем, вам следует избегать htmlentities и использовать htmlspecialchars вместо этого, как htmlentities излишне кодирует все не-ASCII-символы как ссылки на сущности HTML, что также имеет побочный эффект - испортить ваш текст, если вы не дадите ему права $charset параметр.

Другие вопросы по тегам