Итак, у нас есть наши escape-функции HTML, которые действительно работают в стиле C ++, как сделать unescape? - PullRequest
0 голосов
/ 02 ноября 2011

Здесь Я нашел отличный способ для HTML кодирования / экранирования специальных символов.Теперь я задаюсь вопросом, как убрать кодированный HTML-код в C ++?

Итак, кодовая база:

#include <algorithm>

namespace xml {

    // Helper for null-terminated ASCII strings (no end of string iterator).
    template<typename InIter, typename OutIter>
    OutIter copy_asciiz ( InIter begin, OutIter out )
    {
        while ( *begin != '\0' ) {
            *out++ = *begin++;
        }
        return (out);
    }

    // XML escaping in it's general form.  Note that 'out' is expected
    // to an "infinite" sequence.
    template<typename InIter, typename OutIter>
    OutIter escape ( InIter begin, InIter end, OutIter out )
    {
        static const char bad[] = "&<>";
        static const char* rep[] = {"&amp;", "&lt;", "&gt;"};
        static const std::size_t n = sizeof(bad)/sizeof(bad[0]);

        for ( ; (begin != end); ++begin )
        {
            // Find which replacement to use.
            const std::size_t i =
                std::distance(bad, std::find(bad, bad+n, *begin));

            // No need for escaping.
            if ( i == n ) {
                *out++ = *begin;
            }
            // Escape the character.
            else {
                out = copy_asciiz(rep[i], out);
            }
        }
        return (out);
    }

}

и

#include <iterator>
#include <string>

namespace xml {

    // Get escaped version of "content".
    std::string escape ( const std::string& content )
    {
        std::string result;
        result.reserve(content.size());
        escape(content.begin(), content.end(), std::back_inserter(result));
        return (result);
    }

    // Escape data on the fly, using "constant" memory.
    void escape ( std::istream& in, std::ostream& out )
    {
        escape(std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>(),
            std::ostreambuf_iterator<char>(out));
    }

}

Это - теряет спокойствие кода - работаетfor:

#include <iostream>

int main ( int, char ** )
{
    std::cout << xml::escape("<foo>bar & qux</foo>") << std::endl;
}

Итак, я задаюсь вопросом - как сделать HTML таким, чтобы он не появлялся?

1 Ответ

2 голосов
/ 02 ноября 2011

Посмотрите, как я решил аналогичную проблему для '&#(\d+);' строк, то есть числовых ссылок на символы (NCR), используя boost :: spirit , boost :: regex_token_iterator , Flex , Perl .

В вашем случае регулярное выражение равно &(amp|lt|gt);, если вам не нужно преобразовывать все html-сущности .

...