2011-03-28 6 views
5

Estoy usando Jsoup para desinfectar las entradas del usuario de un formulario. El formulario en cuestión contiene un <textarea> que espera texto sin formato. Cuando se envía el formulario, limpio la entrada con Jsoup.clean(textareaContents); sin embargo, dado que html ignora el espacio en blanco adicional, Jsoup.clean() eliminará los valiosos espacios en blanco de la entrada.Evite que Jsoup descarte espacios en blanco adicionales

Por ejemplo, si alguien entró en algunas líneas de texto en el textarea:

hello 

test 

después Jsoup.clean(), tendrá:

hello test 

cómo se puede hacer Jsoup.clean() preservar los espacios en blanco? Sé que está diseñado para analizar html y esto no es html, entonces ¿hay una mejor alternativa?

Respuesta

4

Si su área de texto simplemente espera texto sin formato, entonces creo que sería mejor que solo HTML escapara del texto sin formato. Es decir. convertir las etiquetas de entrada < y > del usuario a &lt; y &gt; respectivamente. Ya sea en la entrada de nuestra salida (la entrada puede ser más segura, por lo que solo debe pensar en ello una vez).

El jsoup HTML cleaner está diseñado, como dices, para analizar el HTML de entrada no confiable y superar el HTML de confianza, donde el formateo se hace con elementos.

8

Para las generaciones futuras, si todavía necesita obtener acceso al texto original con espacios en blanco, puede utilizar el método TextNode.getWholeText().

Código de ejemplo:

/** 
* @param cell element that contains whitespace formatting 
* @return 
*/ 
public static String getText(Element cell) { 
    String text = null; 
    List<Node> childNodes = cell.childNodes(); 
    if (childNodes.size() > 0) { 
     Node childNode = childNodes.get(0); 
     if (childNode instanceof TextNode) { 
      text = ((TextNode)childNode).getWholeText(); 
     } 
    } 
    if (text == null) { 
     text = cell.text(); 
    } 
    return text; 
} 

En el código anterior, asumimos que el pasado en elemento contiene contenido de texto directamente dentro de cuerpo del elemento (tomamos el primer nodo). Si eso no es así, recurrirá al método normal Element.text().

1

La respuesta de Neeme Praks fue muy buena y conservó el espacio en blanco correctamente. Sin embargo, el HTML en línea realmente lo arruina.

<span>This is<br />some text. Cool story.</span> 

Resultados en

"This is" 

O si se pasa en un elemento que no tenga su propio texto, se devuelve un valor nulo.

Así que tuve que volver a trabajar el método un poco para mis propósitos. Esto podría ayudar a algunas personas, así que lo estoy publicando aquí. La idea básica es iterar a los niños en lugar de simplemente tomar el primero. Esto también incluye un caso para tomar el HTML de cualquier elemento sin hijos.

esta manera los rendimientos originales fragmento:

This is<br />some text. Cool story. 

public static String getText(Element cell) { 
    StringBuilder textBuilder = new StringBuilder(); 
    for (Node node : cell.childNodes()) { 
     if (node instanceof TextNode) { 
      textBuilder.append(((TextNode)node).getWholeText()); 
     } 
     else { 
      for (Node childNode : node.childNodes()) { 
       textBuilder.append(getText((Element)childNode)); 
      } 
      textBuilder.append(node.outerHtml()); 
     } 
    } 
    if (cell.childNodes().isEmpty()) { 
     textBuilder.append(cell.outerHtml()); 
    } 
    return textBuilder.toString(); 
} 
+0

que tienen un caso de uso de manera similar inusual en materia de espacio en blanco y el texto está salpicado de ''
etiquetas. Dejé caer tu método y todo está bien ahora (después de horas dedicadas a esto en los últimos dos días). Gracias por tomarse el tiempo para publicar su método. – Paul

+0

¿por qué tiene textBuilder.append (node.outerHtml());?Esto duplicará el contenido de la etiqueta. es decir " hola>" se convertirá en "hola hola". ¿Me estoy perdiendo de algo? – Ammar

Cuestiones relacionadas