Sites référencés | couper

Bonjour

Il y a quelques jours J'ai lancé un appel car j'avais un problème avec mes
sites référencés en page sommaire.
Ils apparaissaient très bien (tout au long) dans la rubrique, mais à la page
sommaire, le descriptif était tronqué de façon aléatoire. 15 caractères pour
un 20 pour un autre. Pourtant j'avais bien le filtre |couper{70} et {50} ou
quelque chose du genre.
Aujourd'hui, j'ai ajouté un site dont le titre comportait deux mots et il a
carrément coupé > (...) après le premier mot!
J'ai régler le problème en enlevant le filtre |couper { } après le titre et le
descriptif, mais j'aimerais quand-même pourquoi |couper fonctionne de façon
si aléatoire...

Si quelqu'un pouvait m'éclairer...

merci!

MH

Aujourd'hui, j'ai ajouté un site dont le titre comportait deux mots et il a
carrément coupé > (...) après le premier mot!
J'ai régler le problème en enlevant le filtre |couper { } après le titre et le
descriptif, mais j'aimerais quand-même pourquoi |couper fonctionne de façon
si aléatoire...

couper{} est prévu pour couper des textes longs ; li n'est pas optimisé pour
ce qui est de "couper court". C'est un bug :slight_smile:

-- Fil

Fil wrote:

Aujourd'hui, j'ai ajouté un site dont le titre comportait deux mots et il a carrément coupé > (...) après le premier mot!
J'ai régler le problème en enlevant le filtre |couper { } après le titre et le descriptif, mais j'aimerais quand-même pourquoi |couper fonctionne de façon si aléatoire...

couper{} est prévu pour couper des textes longs ; li n'est pas optimisé pour
ce qui est de "couper court". C'est un bug :slight_smile:

-- Fil

Salut Fil,
je te propose la fonction ci-dessous qui remplacerait "couper" et qui doit marcher avec des textes plus courts (le problème venait de la systématisation de la recherche d'une fin de chaine):

==================
function couper($texte, $long) {
  $plus_petit = false;
         $texte2 = substr($texte, 0, $long * 2); /* heuristique pour prendre seulement le necessaire */
  if (strlen($texte2) < strlen($texte)) $plus_petit = true;
  $texte = ereg_replace("\[([^\*)->([^]]*)\]","\\1", $texte2);

  // supprimer les notes
  $texte = ereg_replace("\[\[([^]]|\][^]])*\]\]", "", $texte);

  // supprimer les codes typos
  $texte = ereg_replace("[{}]", "", $texte);
  
  $texte2 = substr($texte, 0, $long);
         if (strlen($texte) > $long) {
             // Chercher à couper proprement (ie sur une fin de mot) la phrase
         $texte2 = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*$", "\\1", $texte2);
      $plus_petit = true;
  }
  if ($plus_petit) $texte2 .= '&nbsp;(...)';
  return $texte2;
}

je te propose la fonction ci-dessous qui remplacerait "couper" et qui
doit marcher avec des textes plus courts (le problème venait de la

Merci. Il faudrait le tester sur des chaînes de un ou deux mots comprenant
de 2 à 30 lettres (et avec des accents type &eacute;, tant qu'à faire de
patcher autant le faire "scientifiquement" :slight_smile:

-- Fil

Fil wrote:

je te propose la fonction ci-dessous qui remplacerait "couper" et qui doit marcher avec des textes plus courts (le problème venait de la

Merci. Il faudrait le tester sur des chaînes de un ou deux mots comprenant
de 2 à 30 lettres (et avec des accents type &eacute;, tant qu'à faire de
patcher autant le faire "scientifiquement" :slight_smile:

-- Fil

Si tu le prends ainsi, mais j'ai un doute vu ton code, il serait bien d'y ajouter la détection des tableaux qui n'est pas faite non ? :

========
function couper($texte, $long) {
         $plus_petit = false;

         // Conversion de la chaine en texte brut
         $trans = array_flip(get_html_translation_table (HTML_ENTITIES));
         $phrase_texte = strtr($texte, $trans);

         $texte2 = substr($phrase_texte, 0, $long * 2); /* heuristique pour prendre seulement le necessaire */

  if (strlen($texte2) < strlen($phrase_texte)) $plus_petit = true;
  $texte2 = ereg_replace("\[([^\*)->([^]]*)\]","\\1", $texte2);

  // supprimer les notes
  $texte2 = ereg_replace("\[\[([^]]|\][^]])*\]\]", "", $texte2);

  // supprimer les codes typos
  $texte2 = ereg_replace("[{}]", "", $texte2);

  $texte2 = substr($texte2, 0, $long);
         if (strlen($texte2) > $long) {
             // Chercher à couper proprement (ie sur une fin de mot) la phrase
         $texte2 = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*$", "\\1", $texte2);
      $plus_petit = true;
  }

         // Conversion de la chaîne texte en HTML
         $encoded = strtr($texte2, array_flip($trans));

  if ($plus_petit) $encoded .= '&nbsp;(...)';
         return $encoded;
}

===========

Fil wrote:

je te propose la fonction ci-dessous qui remplacerait "couper" et qui doit marcher avec des textes plus courts (le problème venait de la

Merci. Il faudrait le tester sur des chaînes de un ou deux mots comprenant
de 2 à 30 lettres (et avec des accents type &eacute;, tant qu'à faire de
patcher autant le faire "scientifiquement" :slight_smile:

-- Fil

Voici ma proposition complète pour la fonction couper. En plus de l'existante, elle prend en compte : la supression des tableaux, des puces, des lignes horizontales, des codes HTML. Elle fonctionne pour les textes long comme pour les courts.
J'en appelle aux bonnes volontées pour la tester complètement.

=============================================
function couper($texte, $long) {
         $plus_petit = false;

         // Conversion de la chaine en texte brut
         $trans = array_flip(get_html_translation_table (HTML_ENTITIES));
         $phrase_texte = strtr($texte, $trans);

         // supprimer les liens
  $phrase_texte = ereg_replace("\[([^\*)->([^]]*)\]","\\1", $phrase_texte);

  // supprimer les notes
  $phrase_texte = ereg_replace("\[\[([^]]|\][^]])*\]\]", "", $phrase_texte);

  // supprimer les codes typos
  $phrase_texte = ereg_replace("[{}]", "", $phrase_texte);

         // supprimer les tableaux
  $phrase_texte = ereg_replace("\|.*\|$", "", $phrase_texte);

         // supprimer les listes à puces
         $phrase_texte = ereg_replace("\-[\*|#]+", "", $phrase_texte);

         // supprimer les balises HTML
         $phrase_texte = ereg_replace("<[^<]*>", "", $phrase_texte);

         // supprimer les traits de séparation
         $phrase_texte = ereg_replace("-{4,}", "", $phrase_texte);

         if (strlen($phrase_texte) > $long) {
          $phrase_texte = substr($phrase_texte, 0, $long);
             // Chercher à couper proprement (ie sur une fin de mot) la phrase
         $phrase_texte = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*$", "\\1", $phrase_texte);
      $plus_petit = true;
  }
         // Suppression des espaces de début et fin de chaîne
         $phrase_texte = trim($phrase_texte);

  if ($plus_petit) $phrase_texte .= '&nbsp;(...)';
         return $phrase_texte;
}

Voici ma proposition complète pour la fonction couper. En plus de
l'existante, elle prend en compte : la supression des tableaux, des
puces, des lignes horizontales, des codes HTML.

Oui mais tout ça c'est déjà le rôle de la fonction textebrut()...

a+

Antoine.

Antoine wrote:

Voici ma proposition complète pour la fonction couper. En plus de l'existante, elle prend en compte : la supression des tableaux, des puces, des lignes horizontales, des codes HTML.

Oui mais tout ça c'est déjà le rôle de la fonction textebrut()...

a+

Antoine.

D'après le source de la fonction textebrut(), je dirai que non. Pour preuve entre autres, les accents, les tableaux ... que la fonction ne coupe pas contrairement à ce que je vous propose.
A+
David

Antoine wrote:

Voici ma proposition complète pour la fonction couper. En plus de l'existante, elle prend en compte : la supression des tableaux, des puces, des lignes horizontales, des codes HTML.

Oui mais tout ça c'est déjà le rôle de la fonction textebrut()...

a+

Antoine.

Salut,
alors j'en fais quoi de mon filtre ??
L'est pas beau ou quoi ?? :slight_smile:
A+

Antoine wrote:

Voici ma proposition complète pour la fonction couper. En plus de l'existante, elle prend en compte : la supression des tableaux, des puces, des lignes horizontales, des codes HTML.

Oui mais tout ça c'est déjà le rôle de la fonction textebrut()...

a+

Antoine.

Salut,
alors j'en fais quoi de mon filtre ??
L'est pas beau ou quoi ?? :slight_smile:
A+

@ dlr <david.larouziere@laposte.net> :

Voici ma proposition complète pour la fonction couper. En plus de
l'existante, elle prend en compte : la supression des tableaux, des
puces, des lignes horizontales, des codes HTML. Elle fonctionne pour les
textes long comme pour les courts.

Salut David,

j'envoie dans le CVS une version de couper() inspirée de la tienne, avec
tout de même beaucoup de modifications de manière à pouvoir couper très
court : même |couper{2} fonctionne...

Seul bug restant, qui concerne toutes les fonctions utilisant substr() et
strlen(), ça gère assez mal les caractères unicode ; |couper{100} sur un
texte en arabe ne va laisser que trente ou quarante caractères.

-- Fil

Fil wrote:

@ dlr <david.larouziere@laposte.net> :

Voici ma proposition complète pour la fonction couper. En plus de l'existante, elle prend en compte : la supression des tableaux, des puces, des lignes horizontales, des codes HTML. Elle fonctionne pour les textes long comme pour les courts.
   
Salut David,

j'envoie dans le CVS une version de couper() inspirée de la tienne, avec
tout de même beaucoup de modifications de manière à pouvoir couper très
court : même |couper{2} fonctionne...

Seul bug restant, qui concerne toutes les fonctions utilisant substr() et
strlen(), ça gère assez mal les caractères unicode ; |couper{100} sur un
texte en arabe ne va laisser que trente ou quarante caractères.

-- Fil

Tu es trop bon :slight_smile:
(PS : tu n'es pas obligé de citer mon nom, l'amélioration vient de toi - je n'en revendiquerai jamais la paternité :), ce que vous faites en génral suffit à mon bonheur :slight_smile: )

Reste juste un problème (tordu) :

{{titre gras}}

[fdsfsdf|ddfdsfsdf|

et le filtre ne marche pas..

Autre chose pour rendre le truc encore plus robuste : détecter si $texte n'est pas vide car cela provoque un warning php lors de l'appel à strpos. (je sais c'est tordu)

Merci encore
David