supprimer toutes les balises d'un code html (regex?)
Salut à tous,
J'ai un JTextField contenant du texte formatté en html que je voudrais copier dans le presse papier.
Le probleme est que le texte que je recupère du JTextField est de la forme :
<html><head><body><font color="#0000FF">texte bleu</font> <font color="#FF0000">test rouge</font></body></html>
alors que je ne veus mettre dans le presse papier que : texte bleu texte rouge
Mon probleme est donc de supprimer les balises html, j'ai pensé à utiliser la méthode replace(), malheureusement je ne maitrise pas trop (en fait pas du tout :oops: ) les expressions régulières et je ne trouve pas celle qui me conviendrait.
Ma question est donc (... suspense) quelle est l'expression regulière (si elle existe) qui me permettrait de supprimer toutes les balises ?
Meme problème... en poussant plus loin
Bonjour,
Me voici confronté à la même problèmatique lors du developpement d'un de mes projets perso: Transformer une chaine HTML en texte-brute....
Premierement, merci pour les solutions proposées qui m'ont permis de me donner des axes de reflexion.
La solution apportée sur ce message bien qu'efficace est rapidement apparue insatisfaisante aprés quelques essai au sein de mon projet.
Bien que la solution élimine tous les tags HTML, elle n'en tient absolument pas compte (alors qu'au minimum <br> et <p> méritent d'être interpretés)
Alors qu'au contraire elle conserve la mise en forme de la chaine source (whitespaces/retour a la ligne brut) alors qu'on ne le devrait pas.
Dans la même lignée elle ne gére pas les & et autre qu'il faut convertir adéquatement.
Bref, l'utilisation des regexp ne permet pas d'effectuer une transformation allant dans ce sens...
Aprés avoir chercher les objets sachant manipuler de l'HTML dans l'API Java, je me suis amusé a lire le code source de JEditorPane et JTextPane afin de savoir comment ils faisaient pour presenter un texte HTML.
Solution proposée:
Utiliser un Document (particulierement un HTMLDocument). Un document n'est qu'un conteneur de texte (contents) pour lequel on lui associe des styles. Si on arrive a initialiser correctement le Document (c'est a dire effectuer la séparation entre le contenu et le style), il devient facile de recuperer que le contenu (brut).
A la lecture du code source de JTexPane, l'utilisation d'un EditorKit s'impose d'elle même. En effet HTMLEditorKit alimente un HTMLDocument permettant ainsi de separer les styles.
Voici le code d'exemple:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
/**
* Util class allowing to convert an Html string into a simple-text without any tags.
* This conversion manage specials html sequences like & and as well some basic layout information as <p>
*
* This tools require a well-formed html string...
*
* @author André Sébastien
*/
public class HTMLUtils {
// private members
private HTMLEditorKit kit = new HTMLEditorKit();
private HTMLDocument doc = new HTMLDocument();
// Default instance
private static final HTMLUtils instance = new HTMLUtils();
/** Create a new instance */
public HTMLUtils()
{ /* do nothing */ }
/** Return a default shared-instance
* @return default shared-instance
*/
public static HTMLUtils getDefault()
{ return instance; }
/** Convert an HTML String to a simple-text (without tag)
* @param html well-formed html string
* @return simple-text resulting
*/
public synchronized String getAsText(String html)
{
try
{
// clear our document's contents
doc.remove(0, doc.getLength());
if(html == null || html.equals("") ) return html;
// change <br> tags to <p> since the kit doesn't convert by a new line
html = html.replaceAll("<[bB][rR][\\s]*[/]?>","<p>");
// use the editorKit for separate "attributes set" to "text-contents" by managing the document
Reader r = new StringReader(html);
kit.read(r, doc, 0);
// return only "text-contents" part from the document ignoring this way all "attributes set"
return doc.getText(0, doc.getLength() ).trim();
}
catch(Exception e){ e.printStackTrace(); return null; }
}
/**
* TEST PURPOSE ONLY
*/
public static void main(String[] args) {
String html = "Hello \n How are <b>you</b>?,<p>Me & Lilly are fine<b>";
try
{
System.out.println( HTMLUtils.getDefault().getAsText( html ) );
}
catch(Exception e)
{
e.printStackTrace();
}
}
} |
Remarque: Il semblerait que le <br> soit interpreté par un espace et non par un retour a la ligne, alors que le <p> effectue bien un retour a la ligne... Je n'ai pas pousser plus loin pour le moment...
Voila, je voulais vous faire part de mes recherches.