2009-11-20 5 views
3

J'ai besoin d'un court extrait d'articles en HTML pour montrer sur ma page d'accueil. Évidemment, je ne peux pas utiliser quelque chose d'aussi simple que substr parce qu'il peut laisser des étiquettes non fermées ou même laisser une demi-étiquette.Obtenir un extrait de HTML en PHP

Ce qui est plus facile:

  • Conversion du HTML à un travail décent regardant le texte brut et prendre un morceau de cette
  • Prendre le début du HTML et la fermeture des balises non fermées à la coupure (sera ce regard toujours OK?)

Et comment pourrais-je mettre en œuvre la solution choisie?

+0

Une troisième voie serait d'analyser le code HTML, pour [exemple avec DOMDocument qui prend en charge les balises] (http: // stackoverflow.com/a/29323396/367456). – hakre

Répondre

6

La manière la plus simple est de supprimer tout le HTML du texte de l'article en utilisant strip_tags() avant de le tronquer.

+0

Utiliser ceci maintenant pour les extraits générés automatiquement. Ce n'est pas le meilleur, mais ça va, puisque j'ai fourni des affiches de nouvelles avec un balisage spécial pour spécifier leurs propres extraits. –

3

Je prendrais la 2ème option s'il est important de conserver la structure HTML de l'élément d'information original.

Une manière simple de mettre en œuvre ceci serait d'exécuter votre fragment à travers Tidy pour fermer toutes les balises non fermées. En particulier, voir la méthode tidy::cleanRepair.

1

Vous pouvez essayer d'analyser vos données en XML, puis de tronquer uniquement les nœuds de texte "purs".

Remarque: Cette solution force l'entrée à être valide au format XML et à être toujours dans la même structure.

2

Bonjour Je suppose que ce que vous cherchez est appelé grattage de site Web. Voici comment vous pouvez gratter un site Web; Utilisez une bibliothèque PHP Simple HTML DOM Parser télécharger ici PHP Simple HTML DOM Parser

Et est enfin là le code comment vous pouvez gratter Slashdot

// Create DOM from URL 
$html = file_get_html('http://slashdot.org/'); 

// Find all article blocks 
foreach($html->find('div.article') as $article) { 
    $item['title'] = $article->find('div.title', 0)->plaintext; 
    $item['intro'] = $article->find('div.intro', 0)->plaintext; 
    $item['details'] = $article->find('div.details', 0)->plaintext; 
    $articles[] = $item; 
} 

print_r($articles); 
+0

Ne pas utiliser cela dans cette situation, mais utile néanmoins. –

0

Ce extraits vers le bas au premier paragraphe, sans mots de coupe et piste en option concatène.

extrait $ = self :: excerpt_paragraph ($ html, 180)

/** 
* excerpt first paragraph from html content 
* 
**/ 
public static function excerpt_paragraph($html, $max_char = 100, $trail='...') 
{ 
    // temp var to capture the p tag(s) 
    $matches= array(); 
    if (preg_match('/<p>[^>]+<\/p>/', $html, $matches)) 
    { 
     // found <p></p> 
     $p = strip_tags($matches[0]); 
    } else { 
     $p = strip_tags($html); 
    } 
    //shorten without cutting words 
    $p = self::short_str($p, $max_char); 

    // remove trailing comma, full stop, colon, semicolon, 'a', 'A', space 
    $p = rtrim($p, ',.;: aA'); 

    // return nothing if just spaces or too short 
    if (ctype_space($p) || $p=='' || strlen($p)<10) { return ''; } 

    return '<p>'.$p.$trail.'</p>'; 
} 
// 

/** 
* shorten string but not cut words 
* 
**/ 
public static function short_str($str, $len, $cut = false) 
{ 
    if (strlen($str) <= $len) { return $str; } 
    $string = ($cut ? substr($str, 0, $len) : substr($str, 0, strrpos(substr($str, 0, $len), ' '))); 
    return $string; 
} 
//