2010-10-29 5 views
0

J'ai une chaîne de java avec un texte et html:String Java Manipulation HTML tags

<title>test title</title> 
blabla bla more text 

Ce que je suis en train de réaliser deux volets:

1) Récupérer le contenu de <title></title> et économisez dans une chaîne séparée.

2) Retirez cette partie de la chaîne d'origine: <title>test title</title>

Ainsi, le résultat final serait quelque chose comme

originalString:

<title>test title</title> 
blabla bla more text 

nouvelleChaine:

blabla bla more text 

pageTitle : test title

Comment puis-je y parvenir? expressions régulières? Je ne peux pas vraiment le saisir ...

+1

Est-ce pertinent? http://stackoverflow.com/questions/240546/removing-html-from-a-java-string –

Répondre

1

Don't use regular expressions to parse HTML! Essayez d'utiliser JTidy ou any of these analyseurs HTML open-source pour Java, qui correspondent à vos besoins. L'utilisation de ces bibliothèques vous facilitera la vie, car elles sont conçues pour analyser le code HTML. Vous pouvez saisir les nœuds que vous voulez et en extraire le texte.

+0

Ne pensez-vous pas que vous êtes un peu dur? – tchrist

+0

@tchrist Comment suis-je dur? –

+0

Vous êtes dur parce que vous ne connaissez pas les circonstances exactes de l'affiche. Il existe des situations limitées où les motifs * peuvent * être utilisés pour faire correspondre le HTML à de bons résultats. Le dogme SO standard, bien qu'intéressé, peut être maladroit. Si vous connaissez votre jeu d'entrée, ce n'est pas trop difficile. Si ce n'est pas le cas, alors c'est le cas. Voir mon autre commentaire plus long. – tchrist

1

Voici comment vous pouvez utiliser une expression régulière pour extraire le texte entre les balises de titre:

String s = "<title>test title</title>"; 
    Pattern p = Pattern.compile("<title>(.*?)</title>"); 
    Matcher m = p.matcher(s); 
    while(m.find()){ 
     System.out.println(m.group(1)); 
    } 
+0

C'est la façon de gentleman! – m88

+2

Erreurs dans cette réponse: (1) HTML n'est pas sensible à la casse; (2) le point ne correspond pas aux terminaisons de ligne; (3) vous avez oublié de tenir compte des attributs standard; (4) vous ne devriez pas correspondre dans les commentaires ou les balises de script; (5) une correspondance minimale ne garantit pas qu'elle ne contiendra pas d'étiquette ouverte en double sur une entrée malformée (6), vous ne devriez pas faire correspondre les attributs entre guillemets. Il y a probablement plus d'erreurs, mais celles-ci sont juste au dessus de ma tête. Néanmoins, cela va probablement résoudre son problème. Alors qu'est-ce que cela vous dit? – tchrist

0

It is inadvisable to parse XML/HTML with regular expressions. Toutefois, si vous devez absolument faire cette chose que vous avez demandé, essayez ceci:

package org.apache.people.mclark.examples.regex; 
import java.util.regex.*; 
public class Regex1 { 
    public static void main(String[] args) { 
     final String subjectString = "<title>test title</title>\n" + 
      "blabla bla more text"; 
     Pattern regex = Pattern.compile("<title>(.*?)</title>(.*)", 
       Pattern.DOTALL); 
     Matcher regexMatcher = regex.matcher(subjectString); 
     if (regexMatcher.find()) { 
      String pageTitle = regexMatcher.group(1); 
      String leftOvers = regexMatcher.group(2); 
      System.out.println("pageTitle[" + pageTitle + "]"); 
      System.out.println("leftOvers[" + leftOvers + "]"); 
     } else { 
      System.out.println("no match"); 
     } 
    } 
} 

Je me lave les mains de toute mauvaise conduite!

+0

Vous ne voulez pas dire pas possible; vous voulez dire incroyablement difficile à obtenir dans le cas général. (Ou vous parlez seulement d'expressions régulières de manuels, pas de modèles modernes.) Cela peut être un peu plus facile qu'impossible si nous parlons d'une démo truquée avec un ensemble d'entrées fini connu. Peut-être qu'il en a un. Peut-être qu'il ne le fait pas. – tchrist

+0

tchrist, regex n'est pas récursif et ne peut donc pas, par exemple, faire correspondre des balises équilibrées imbriquées. Certaines expressions de regex ont récemment ajouté des constructions récursives, mais elles sont difficiles à utiliser. Peut-être "impossible" est un mot fort, beaucoup de choses sont possibles (mais pas recommandables) avec regex. En fait, je ne faisais que citer le dogme SO standard sur le wiki du tag regex @ http://stackoverflow.com/tags/regex/info. Le niveau de difficulté pour certains problèmes est si élevé qu'il est pratiquement impossible pour les novices de l'appliquer correctement. –

+0

Les motifs modernes sont certainement * [récursifs] (http://stackoverflow.com/questions/4031112/regular-expression-matching/4034386#4034386). Mais leur utilisation pour [HTML correspondant] (http://stackoverflow.com/questions/4044946/regex-to-split-html-tags/4045840#4045840) est tellement sujette aux erreurs et difficile dans le cas général que de ne pas être vaut la peine. Ce n'est que pour des ensembles d'entrées entièrement restreints de caractéristiques connues que cela fonctionne facilement, bien que dans ces cas, il puisse souvent faire un bon travail. L'entrée est rarement aussi limitée que les gens croient. – tchrist