6
votes

Comment générer l'extrait comme ceux générés par Google avec PHP et MySQL?

Par exemple, il renvoie simplement l'extrait autour duquel le mot clé de recherche existe.

et une partie du texte est remplacée par "...".

est-il possible d'atteindre cet objectif avec PHP et MySQL?


1 commentaires

ceux-ci sont appelés ellipsis (es) en.wikipedia.org/wiki/ellipsis


4 Réponses :


0
votes
$string1="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.";
function trimmer($updates,$wrds,$pos){
    if(strlen($updates)<=$wrds) {
        return $updates;
} else {
        $marker = strrpos(substr($updates,$pos,$wrds),' ');
        $string = substr(substr($updates,$pos,$wrds),0,$marker)."...";
        return $string;
    }
}

$pos = strpos($string1, "dummy");
echo trimmer($string1,100,$pos);

2 commentaires

Pensez à ce que si les mots-clés existent 201 caractères du début. Vous avez renvoyé les 200 premiers caractères, mais sans mots-clés inclus.


J'ai ajouté une édition ... peut-être que c'est ce que tu veux



4
votes
function excerpt($text, $phrase, $radius = 100, $ending = "...") {
    $phraseLen = strlen($phrase);
    if ($radius < $phraseLen) {
        $radius = $phraseLen;
    }

    $pos = strpos(strtolower($text), strtolower($phrase));

    $startPos = 0;
    if ($pos > $radius) {
        $startPos = $pos - $radius;
    }

    $textLen = strlen($text);

    $endPos = $pos + $phraseLen + $radius;
    if ($endPos >= $textLen) {
        $endPos = $textLen;
    }

    $excerpt = substr($text, $startPos, $endPos - $startPos);
    if ($startPos != 0) {
        $excerpt = substr_replace($excerpt, $ending, 0, $phraseLen);
    }

    if ($endPos != $textLen) {
        $excerpt = substr_replace($excerpt, $ending, -$phraseLen);
    }

    return $excerpt;
}
Shamelessly stolen from the Cake TextHelper.

0 commentaires

9
votes

La fonction de DÉCEZE modifiée légèrement pour permettre de multiples phrases. par exemple. Votre phrase peut être "TESTA TESTB" et s'il ne trouve pas TESTA, il ira à TestB.

function highlight($c,$q){ 
$q=explode(' ',str_replace(array('','\\','+','*','?','[','^',']','$','(',')','{','}','=','!','<','>','|',':','#','-','_'),'',$q));
for($i=0;$i<sizeOf($q);$i++) 
    $c=preg_replace("/($q[$i])(?![^<]*>)/i","<span class=\"highlight\">\${1}</span>",$c);
return $c;}


4 commentaires

Pouvez-vous mettre en évidence les phrases?


Je reçois un avertissement: Strows (): aiguille vide lors de la recherche d'une chaîne vide. J'ai essayé avec vérification si tout est vide, null ou même set, mais je reçois toujours cet avertissement ...


Je l'ai testé sur 3,9, et cela fonctionne, mais ils l'ont changé en 4.0 ... Toute information sur la façon de gérer cela?


Cela renvoie des extraits contenant uniquement le premier mot-clé. Peut-être que c'est ce que l'OP veut, peut-être que d'autres nécessiteraient d'avoir un extrait contenant autant de mots-clés que possible (plusieurs "extraits" séparés par des ellipsis "...").



6
votes

Ma solution pour plusieurs mots-clés multiples et multiples occurrences (fonctionne également pour les accents insensibles insensibles): xxx

Ceci est exemple résultat pour Query = "Å¡vihov prohlãdkám"

résultat


3 commentaires

FyI- Cela semble ne pas correspondre si la ligne dans $ texte contenant $ requise n'a pas de nouvelle ligne avant et après elle. $ text = "\ n $ {text} \ n" est une solution de contournement simple, mais le regex peut avoir besoin d'ajustement


Cela retourne très longs extraits si vous avez un long texte et de nombreux hits.


Superbes trucs! Merci.