Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Java缩写HTML?_Java_Html_Parsing_Xhtml_Html Parsing - Fatal编程技术网

如何用Java缩写HTML?

如何用Java缩写HTML?,java,html,parsing,xhtml,html-parsing,Java,Html,Parsing,Xhtml,Html Parsing,用户在表单中以HTML形式输入文本,例如: <p>this is my <strong>blog</strong> post, very <i>long</i> and written in <b>HTML</b></p> 因为这不是很容易做到正确,我通常剥离所有标签和截断。这可以很好地控制文本大小和外观,通常需要将其放置在需要控制的位置 请注意,您可能会发现我的建议非常保守,实际上并不是对您问题

用户在表单中以HTML形式输入文本,例如:

<p>this is my <strong>blog</strong> post, 
very <i>long</i> and written in <b>HTML</b></p>

因为这不是很容易做到正确,我通常剥离所有标签和截断。这可以很好地控制文本大小和外观,通常需要将其放置在需要控制的位置

请注意,您可能会发现我的建议非常保守,实际上并不是对您问题的正确答案。但大多数情况下,替代方案是:

  • 去掉所有标签并截断
  • 提供另一个内容可管理的富文本,该富文本将用作截断文本。当然,这仅适用于CMSE等情况
截断HTML很困难的原因是,您不知道截断将如何影响HTML的结构。在一个<代码> > UL> <代码>中,或者甚至是最坏的情况下,如何在复杂的<代码> ?

中截断?
所以这里的问题是HTML不仅可以包含内容和样式(粗体、斜体),还可以包含结构(列表、表格、div等)。因此,一个好且安全的实现是将所有内联“样式化”标记(粗体、斜体等)分离并截断,同时跟踪未关闭的标记。

我不知道任何库,但它应该不会如此复杂(对于80%)。 您只需要一个简单的“解析器”,它可以理解4种类型的令牌:

  • 开始标记-所有以
    结尾的标记
  • 结束标记-所有以
    结束的标记
  • 自动关闭标签(如

    )-所有以
    开头但不是code//code,以code//code但不是code>
    结尾的标签
  • 普通字符-所有不是其他类型的字符
然后,您必须遍历输入字符串,并计算“普通字符”。当您沿着字符串进行计数时,只要计数的正常字符小于或等于您想要的数量,就可以将每个令牌复制到输出

在处理输入时,还需要构建当前打开标记的堆栈。每次遍历“开始标记”时,您都会将其放入堆栈(其名称),每次找到结束标记时,您都会从堆栈中删除最上面的标记名称(希望输入的是正确的XHTML)

当达到所需的正常字符数时,只需为堆栈上剩余的标记名编写结束HTML标记

但要小心,这只适用于格式良好的XML输入


我不知道你想用这段代码做什么,但你应该注意HTML/JavaScript注入攻击。

如果你真的想缩写HTML,那么就直接做(按所需长度剪切文本),将简短的结果传递给大家,并希望得到最好的结果。

这项常见任务有很多LIB和工具:

  • 从(雅加达Taglibs已退休)
  • 来自(Marnix van Bochove在评论中提到了allready。)

在某些情况下,如HTML表从字符串的一部分开始,或脚本元素或字符串开始,您希望看到什么?请查看此类的HtmlString方法:确实,HTML结构需要保留,这就是问题所在。您的答案很好,但我希望避免使用JavaCC或类似的工具来保持项目的简单。有人知道图书馆会这么做吗?我没提到JavaCC。只需将HTML展平并缩写为纯文本即可。否则,提供一个单独的RTE,CM将在其中键入缩写的rich text.mmm。这是一个想法:)让我们阅读用户条目,模拟重新写入,保持标记处于动态状态,然后关闭所有打开的内容。我要试试看。保持联系。终于手动完成了。使用XML解析器解析HTML,手动计算getText()元素中的单词数,当单词数为node时,将下一个文本实体设置为空,然后递归删除所有空标记。是的,你是对的。我更喜欢使用强大的库来实现这一点。我们可以使用XML解析器,但我会避免这种情况,因为我的客户能够在他们的输入字段中放入格式错误的XHTML。也许使用像JavaCC这样的lex/yacc分析器就可以做到这一点,但这对于我们产品中的«small»功能来说是额外的工作;tidy.setXHTML(true);try(ByteArrayInputStream bais=newbytearrayinputstream(StringUtils.缩写(strContents,200).getBytes(“ISO-8859-1”)){try(ByteArrayOutputStream bas=newbytearrayoutputstream()){tidy.parse(bais,bas);返回新字符串(bas.toByteArray(),“ISO-8859-1”)} }
<p>this is my <strong>blog</strong> post, very <i>l</i>...</p>
this is my <strong>blog</strong> post, very <i>lo</i>...
MyLibrary.abbreviateHTML(string,20) ?