Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
从一些RTF/HTML文本中提取第一个格式化行_Html_Jsf 2 - Fatal编程技术网

从一些RTF/HTML文本中提取第一个格式化行

从一些RTF/HTML文本中提取第一个格式化行,html,jsf-2,Html,Jsf 2,好的,我把自己画到了一个角落里,还没有决定出路 我的web应用程序承载一系列由用户编写的文档,并通过PrimeFaces使用CLEditor编辑器进行编辑。文档可以是用户选择的任何大小和格式 我想做的是将文档的第一行视为标题,这样当我创建这些文档的列表时,我只显示标题,然后用户可以单击该表行以查看整个文档。我用一个字母来显示标题 <h:outputText value="#{backBean.doc}" escape="false" /> 我所做的是将文档的子字符串向上拉,直到

好的,我把自己画到了一个角落里,还没有决定出路

我的web应用程序承载一系列由用户编写的文档,并通过PrimeFaces使用CLEditor编辑器进行编辑。文档可以是用户选择的任何大小和格式

我想做的是将文档的第一行视为标题,这样当我创建这些文档的列表时,我只显示标题,然后用户可以单击该表行以查看整个文档。我用一个字母来显示标题

<h:outputText value="#{backBean.doc}" escape="false" />

我所做的是将文档的子字符串向上拉,直到但不包括br标记的第一个模式。除非用户应用跨越该范围的格式,否则该方法是有效的。生成的字符串具有未关闭的HTML标记,通常是divspan),当它们在输出时没有转义,它们会干扰甚至清空页面的其余部分


因此,我正在寻找一个简单的解决方案来修复HTML片段。我不想导入一个巨大的库,比如JTidy,因为它包含了我现在没有的所有依赖项,比如DOM解析器等等。有人能推荐一个更便宜但更健壮的解决方案吗?有什么方法可以在客户端清除这些内容吗?

您应该以某种方式避开文档的部分内容,否则用户可以上载包含HTML/JavaScript代码的文档,这将损害您的站点。正如您所看到的,即使是简单的格式设置也会破坏它。一种解决方案是删除所有标记(通过正则表达式、字符串替换等),然后转义标题

您应该以某种方式转义文档的部分内容,否则用户可以上载包含HTML/JavaScript代码的文档,这将损害您的站点。正如您所看到的,即使是简单的格式设置也会破坏它。一种解决方案是删除所有标记(通过正则表达式、字符串替换等),然后转义标题

我想出了一个很好的方法。这对我来说似乎很严厉,但在提出更好的建议之前,我会一直坚持下去。此外,如果其他人处于这种情况,这可能会很有用:

public class TitleRTF {    

private static final Pattern pTidy = Pattern.compile("<body>(.*)</body>");

public TitleRTF() {}

public static String getTitle(String rtfSource) {

    org.w3c.tidy.Tidy tidy = new org.w3c.tidy.Tidy(); 
    tidy.setQuiet(true);

    ByteArrayInputStream bais = new ByteArrayInputStream(rtfSource.getBytes());
    org.w3c.dom.Document doc = tidy.parseDOM(new BufferedInputStream(bais), null);
    try {
        Transformer tr = TransformerFactory.newInstance().newTransformer();
        StreamResult result = new StreamResult(new StringWriter());
        NodeList list = doc.getElementsByTagName("body");
        if (list.getLength() > 0) {
            DOMSource source = new DOMSource(list.item(0));
            tr.transform(source, result);
            String text = result.getWriter().toString();
            Matcher m = pTidy.matcher(text);
            if (m.find()) return m.group(1);
        }
    } catch (TransformerException ex) {        }
    return "(not parsable)";
}
}
公共类标题{
私有静态最终模式pTidy=Pattern.compile((*);
公共标题tf(){}
公共静态字符串getTitle(字符串rtfSource){
org.w3c.tidy.tidy=新org.w3c.tidy.tidy();
整洁,安静(真);
ByteArrayInputStream bais=新的ByteArrayInputStream(rtfSource.getBytes());
org.w3c.dom.Document doc=tidy.parseDOM(新的BufferedInputStream(BAI),null);
试一试{
Transformer tr=TransformerFactory.newInstance().newTransformer();
StreamResult=新的StreamResult(新的StringWriter());
NodeList list=doc.getElementsByTagName(“body”);
if(list.getLength()>0){
DOMSource=新的DOMSource(列表项(0));
tr.transform(源、结果);
String text=result.getWriter().toString();
Matcher m=pTidy.Matcher(文本);
如果(m.find())返回m.group(1);
}
}catch(TransformerException ex){}
返回“(不可解析)”;
}
}

需要添加的一件事是防止JTidy记录它认为是HTML错误的内容。setQuiet(true)似乎无法做到这一点。

我找到了jtiy的方法。这对我来说似乎很严厉,但在提出更好的建议之前,我会一直坚持下去。此外,如果其他人处于这种情况,这可能会很有用:

public class TitleRTF {    

private static final Pattern pTidy = Pattern.compile("<body>(.*)</body>");

public TitleRTF() {}

public static String getTitle(String rtfSource) {

    org.w3c.tidy.Tidy tidy = new org.w3c.tidy.Tidy(); 
    tidy.setQuiet(true);

    ByteArrayInputStream bais = new ByteArrayInputStream(rtfSource.getBytes());
    org.w3c.dom.Document doc = tidy.parseDOM(new BufferedInputStream(bais), null);
    try {
        Transformer tr = TransformerFactory.newInstance().newTransformer();
        StreamResult result = new StreamResult(new StringWriter());
        NodeList list = doc.getElementsByTagName("body");
        if (list.getLength() > 0) {
            DOMSource source = new DOMSource(list.item(0));
            tr.transform(source, result);
            String text = result.getWriter().toString();
            Matcher m = pTidy.matcher(text);
            if (m.find()) return m.group(1);
        }
    } catch (TransformerException ex) {        }
    return "(not parsable)";
}
}
公共类标题{
私有静态最终模式pTidy=Pattern.compile((*);
公共标题tf(){}
公共静态字符串getTitle(字符串rtfSource){
org.w3c.tidy.tidy=新org.w3c.tidy.tidy();
整洁,安静(真);
ByteArrayInputStream bais=新的ByteArrayInputStream(rtfSource.getBytes());
org.w3c.dom.Document doc=tidy.parseDOM(新的BufferedInputStream(BAI),null);
试一试{
Transformer tr=TransformerFactory.newInstance().newTransformer();
StreamResult=新的StreamResult(新的StringWriter());
NodeList list=doc.getElementsByTagName(“body”);
if(list.getLength()>0){
DOMSource=新的DOMSource(列表项(0));
tr.transform(源、结果);
String text=result.getWriter().toString();
Matcher m=pTidy.Matcher(文本);
如果(m.find())返回m.group(1);
}
}catch(TransformerException ex){}
返回“(不可解析)”;
}
}
需要添加的一件事是防止JTidy记录它认为是HTML错误的内容。setQuiet(true)似乎不起作用。

我建议

要解析HTML并获取其
内容,需要使用以下一行代码:

String htmlBody = Jsoup.parse(userInput).body().html();
顺便说一句,由于您似乎打算重新显示用户控制的HTML unescaped,我强烈建议它防止。例如

这样,您就可以安全地重新显示它,而不用担心XSS攻击漏洞:

<h:outputText value="#{bean.safeHtmlBody}" escape="false" />

另见:
    • 我建议

      要解析HTML并获取其
      内容,需要使用以下一行代码:

      String htmlBody = Jsoup.parse(userInput).body().html();
      
      顺便说一句,由于您似乎打算重新显示用户控制的HTML unescaped,我强烈建议它防止。例如

      这样,您就可以安全地重新显示它,而不用担心XSS攻击漏洞:

      <h:outputText value="#{bean.safeHtmlBody}" escape="false" />
      
      
      
      另见:

      根据您的描述,如果不打开注入安全漏洞,就无法在网页中使用CLEdtior,然后为其他用户重新呈现用户的格式化文本。数千个使用CLEditor的站点都是这样吗?问题更多地与未初始化输入的重新提交有关。只要在重新提交部分输入之前以某种方式转义输入,就可以防止xss和注入攻击