Bonjour a tous !

Je cherche désespérément le moyen de "localiser" un extrait autour d'un mot (ou groupe de mot).

Je m'explique.. voici une chaine de caractere :

Je suis tres heureux de vivre dans ce monde. La vie est belle, les oiseaux chantent, et je suis a court d'imagination.

le mot recherché sera 'oiseaux'

le resultat esperé :

...monde. La vie est belle, les OISEAUX chantent, et je suis a cou...

je vous remercie :D

6 réponses


Xeta
Réponse acceptée

Hello,
Je crois que tu travail avec CakePHP il me semble (vue ton sujet dans la rubrique CakePHP ^^).
Si c'est le cas, pas besoin de strpos etc, juste ça : http://book.cakephp.org/2.0/fr/core-libraries/helpers/text.html#TextHelper::excerpt

Et la fonction du Core de Cake (si tu utilise pas Cakephp):

/**
  * Extracts an excerpt from the text surrounding the phrase with a number of characters on each side
  * determined by radius.
  *
  * @param string $text String to search the phrase in
  * @param string $phrase Phrase that will be searched for
  * @param int $radius The amount of characters that will be returned on each side of the founded phrase
  * @param string $ellipsis Ending that will be appended
  * @return string Modified string
  * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/text.html#TextHelper::excerpt
  */
     public static function excerpt($text, $phrase, $radius = 100, $ellipsis = '...') {
         if (empty($text) || empty($phrase)) {
             return self::truncate($text, $radius * 2, array('ellipsis' => $ellipsis));
         }

         $append = $prepend = $ellipsis;

         $phraseLen = mb_strlen($phrase);
         $textLen = mb_strlen($text);

         $pos = mb_strpos(mb_strtolower($text), mb_strtolower($phrase));
         if ($pos === false) {
             return mb_substr($text, 0, $radius) . $ellipsis;
         }

         $startPos = $pos - $radius;
         if ($startPos <= 0) {
             $startPos = 0;
             $prepend = '';
         }

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

         $excerpt = mb_substr($text, $startPos, $endPos - $startPos);
         $excerpt = $prepend . $excerpt . $append;

         return $excerpt;
     }

Elle est pas belle la vie ? :-°

Salut,

Il existe ces deux fonctions en php qui te permettent de faire ça :

Pour trouver la position du mot dans ta chaîne.
http://php.net//manual/fr/function.strpos.php

Pour ne récupérer qu'une partie de la chaîne.
http://php.net//manual/fr/function.substr.php

Avec strpos tu recherches les positions du mot que tu recherches, pour cela le plus simple reste de faire une fonction récursive avec strpos (qui permet de ne trouver que la première occurrence mais heureusement propose un offset) puis avec substr tu récupères les x caractères que tu veux avant la position du mot et les x caractères que tu veux après la position + longueur du mot.

Canonier
Auteur

Merci !
Mais depuis que j'ai vu ta solution, je n’arrête pas de chercher le code final..
Je le compose comme suis :

$kwplace = strpos($all, $k); // place du mot
$debut = substr($all, ($kwplace - 100), '100'); // les 100 (ou 99) caracteres le précedant
$fin = substr($all, $kwplace, '100'); // les 100 suivants
$extrait = $debut.' '.$fin

Cependant ca ne fonctionne pas du tout.... je ne comprend pas pourquoi.. :(

Bonsoir,

Relis ce que fais la fonction "strpos" et tu comprends surement pourquoi cela ne fonctionne pas.

Bonsoir,

En gros il faut que tu fasses une boucle qui remplit un tableau et recherche toutes les occurences du mot car là tu ne recherches que la première occurence, tu fais comme ceci en php :

J'utilise dans mon exemple la fonction strlen

<?php
    $position_correspondances = array();
    for ($position = strpos($chaine, $mot,$position);$position < strlen($chaine) && $position;$position = strpos($chaine, $mot,$position))
        $position_correspondances] = $position;
?>

Et pour prendre le début et la fin des extraits il faudra que tu fasses d'autres tableaux pour pouvoir stocker le début et la fin de chaque correspondance.

Canonier
Auteur

Haaaa ! tu es un magicien !! :D
Merci à tous pour votre aide précieuse ^^