2010-01-02 7 views
0

Je voudrais extraire le texte d'un document html en gardant les liens à l'intérieur. par exemple:Extrait du texte et des liens du HTML en utilisant des expressions régulières

A partir de ce code HTML

<div class="CssClass21">bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 <img src="http://www.contoso.com/hello.jpg"> <span class="cssClass34">hello hello</span> 

je voudrais extraire tout ce

bla1 bla1 bla1 <a href="http://www.ibrii.com">go to ibrii</a> bla2 bla2 bla2 hello hello 

Dans un autre poste sur StackOverflow j'ai trouvé le RegEx <[^>]*> qui permet d'extraire le texte en remplaçant chaque match avec rien. Comment puis-je exclure les balises d'ancrage du match? Il semble que RegEx n'autorise pas la correspondance inverse.

+3

Utilisez un analyseur HTML! Regex ne peut pas analyser HTML correctement. –

+0

Vous avez raté ce post: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

Quel langage de programmation utilisez-vous? Les réponses peuvent être beaucoup plus pertinentes pour vous si vous nous le dites. –

Répondre

0

temporairement encoder <a href ...>...</a> en quelque chose d'autre, supprimer toutes les autres balises puis restaurer les <a> tags:

// Example in javascript: 
string. 
    replace(/<a(.*?)>/g,'\0$1\0'). 
    replace(/<\/a>/,'\1'). 
    replace(/<[^>]*>/,''). 
    replace(/\0(.*?)\0/,'<a$1>'). 
    replace(/\1/,'</a>'); 

Dans le code ci-dessus j'utilise les caractères NUL et SOH (0x00 ASCII et 0x01) en remplacement des <a> étiquettes simplement parce qu'il est hautement improbable qu'ils apparaissent dans les chaînes. N'hésitez pas à les remplacer par d'autres caractères ou séquences de caractères qui n'apparaîtraient pas dans votre chaîne.

De commentaires supplémentaires, il semble que vous utilisez un navigateur. Dans ce cas, le navigateur a déjà analysé le HTML pour vous dans un arbre DOM sympa. Utiliser des méthodes DOM pour analyser à travers l'arbre et le traiter comme vous le souhaitez:

function simpleHTML (domNode) { 
    var ret = ""; 
    if (domNode.nodeType === Node.ELEMENT_NODE) { 
     var children = domNode.childNodes; 
     for (var i=0;i<children.length;i++) { 
      var child = children[i]; 

      // Filter out unwanted nodes to speed up processing. 
      // For example, you can ignore 'SCRIPT' nodes etc. 
      if (child.nodeName != 'SCRIPT') { 
       if (child.nodeName == 'A') { 
        ret += '<a href="' + child.href + '">' + 
           simpleHTML(child) + 
          '</a>'; 
       } 
       else { 
        ret += simpleHTML(child); 
       } 
      } 
     } 
    } 
    else if (domNode.nodeType === Node.TEXT_NODE) { 
     ret += domNode.nodeValue; 
    } 
    return ret; 
} 
// serialize the whole document: 
var simpleDocument = simpleHTML(document.body); 

// serialize a div: 
var simpleDiv = simpleHTML(document.getElementById('some_div')); 

// filter a html formatted string: 
var temp = document.createElement('DIV'); 
temp.innerHTML = original_string; 
simple_string = simpleHTML(temp); 
+0

vous rock homme;) – Licx

2

Les expressions régulières ne permettent une forme non négligeable de la négation par lookahead mais dans ce cas il serait juste bon comme un excercise parce que, Bien que je ne sois pas un zélote qui brûle avec un feu sacré à chaque fois que l'expression rationnelle est mentionnée avec HTML, c'est vraiment un problème à résoudre avec un analyseur.