2011-05-30 2 views
1

J'ai besoin d'une fonction dans php qui extrait une description d'une URL de site qui n'a pas de description de méta tag aucune idée?Description d'extrait dans le site sans la description de balise meta?

j'ai essayé cette fonction, mais ne fonctionne pas:

$content = file_get_contents($url); 

function getExcerpt($content) { 
    $text = html_entity_decode($content); 
    $excerpt = array(); 
    //match all tags 
    preg_match_all("|<[^>]+>(.*)]+>|", $text, $p, PREG_PATTERN_ORDER); 
    for ($x = 0; $x < sizeof($p[0]); $x++) { 
    if (preg_match('<p>i', $p[0][$x])) { 
     $strip = strip_tags($p[0][$x]); 
     if (preg_match("/\./", $strip)) 
     $excerpt[] = $strip; 
    } 
    if (isset($excerpt[0])){ 
     preg_match("/([^.]+.)/", $strip,$matches); 
     return $matches[1]; 
    } 
    } 
    return false; 
} 

$excerpt = getExcerpt($content); 
+0

Qu'est-ce que vous essayez de faire exactement? Que voulez-vous dire par "extraire une description?" –

+0

@Pekka Je suppose qu'il essaie de prendre un extrait de texte pertinent à partir d'une page sans méta description. – alexn

+0

oui si le site n'a pas de description de balise meta et je veux cependant extraire du texte pour le décrire – grigione

Répondre

2

Parsing HTML with RegEx est presque toujours une mauvaise idée. Heureusement, PHP a des bibliothèques qui peuvent faire le travail pour vous. Le code suivant utilise DOMDocument pour extraire la méta description ou, si elle n'existe pas, les 1000 premiers caractères de la page.

<?php 
function getExcerpt($html) { 

    $dom = new DOMDocument(); 

    // Parse the inputted HTML into a DOM 
    $dom->loadHTML($html); 

    $metaTags = $dom->getElementsByTagName('meta'); 

    // Check for a meta description and return it if it exists 
    foreach ($metaTags as $metaTag) { 
     if ($metaTag->getAttribute('name') === "description") { 
      return $metaTag->getAttribute('content'); 
     } 
    } 

    // No meta description, extract an excerpt from the body 
    // Get the body node 
    $body = $dom->getElementsByTagName('body'); 
    $body = $body->item(0); 

    // extract the contents 
    $bodyText = $body->textContent; 

    // collapse any line breaks 
    $bodyText = preg_replace('/\s*\n\s*/', "\n", $bodyText); 
    // collapse any more leftover spaces or tabs to single spaces 
    $bodyText = preg_replace('/[ ]+/', ' ', $bodyText); 

    // return the first 1000 chars 
    return trim(substr($bodyText, 0, 1000)); 

} 

$html = file_get_contents('test.html'); 

echo nl2br(getExcerpt($html)); 

Vous aurez probablement envie d'ajouter un peu plus logique, certains traversal DOM pour essayer de trouver le contenu, ou juste un peu extrait près du milieu du texte. En l'état, ce code va probablement saisir un tas de choses indésirables comme le haut de la page de navigation, etc.

1

Vous devez d'abord vérifier s'il y a méta description disponible, si oui alors afficher cette recherche d'autre pour les <p> balises et afficher les données que la description (vous pourriez vouloir mettre une limite sur la longueur d'un paragraphe, par exemple si la longueur est inférieure à 30, recherchez le paragraphe suivant). S'il n'y a pas de tag <p> alors affichez simplement le titre comme description (c'est comme ça que facebook et Digg fonctionne)

Questions connexes