代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

从C中的明文生成HTML(即br和p标签)++

  •  1
  • Dominic Rodger  · 技术社区  · 16 年前

    我有一堆这样的文字:

    foo
    bar
    
    baz
    

    <p>foo<br />bar</p>
    <p>baz</p>
    

    我很乐意使用boost regex_replace \n\n

    在我工作的环境中,大多数第三方库都不可用。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

    这应该没关系(可以通过安装子系统来优化) 与遇到两个换行符时相同。那里 产生输出)。

    • 遇到了双新线。进入状态时的动作:输出<p>;,线和</p>;

    • 遇到了一条新线路。进入状态时的动作:线路输出和

        2
  •  2
  •   Brian Agnew    16 年前

    别忘了为HTML实体编码文本!例如,如果你有

    foo&
    

    foo&amp;
    

        3
  •  1
  •   Vinay Sajip    16 年前

    如果你的数据中没有意外,你可以替换所有的实例 \n\n 随着 </p><p> \n 随着 <br/> <p> </p>

    更新: \n\n\n , \n\n\n\n <

        4
  •  0
  •   Adrian McCarthy    16 年前

    紧凑、快速、丑陋的状态机。处理退化的情况,如空输入、输入开头的空行、段落之间的长空行字符串以及输入末尾缺少换行符。

    template <typename InputIt, typename OutputIt>
    void TextToHTML(InputIt begin, InputIt end, OutputIt target) {
    start:  if (begin == end) return;
            if (*begin == '\n') { ++begin; goto start; }
            *target++ = '<'; *target++ = 'p'; *target++ = '>';
    para:   *target++ = *begin++;
            if (begin == end) goto endp;
            if (*begin != '\n') goto para;
            if (++begin == end) goto endp;
            if (*begin == '\n') goto endp;
            *target++ = '<'; *target++ = 'b'; *target++ = 'r'; *target++ = ' '; *target++ = '/'; *target++ = '>';
            goto para;
    endp:   *target++ = '<'; *target++ = '/'; *target++ = 'p'; *target++ = '>'; *target++ = '\n';
            goto start;
    }
    
    int main() {
        std::string text = "foo\nbar\n\nbaz";
        std::string html;
        TextToHTML(text.begin(), text.end(), std::back_inserter(html));
        std::cout << html << std::endl;
        return 0;
    }