Mesurer la longueur d’un article

Un petit article à vocation pédagogique pour montrer comment il est possible d’utiliser un filtre php dans spip.

Il peut être utile de compter le nombre de signes, de caractères ou de mots d’un article (comme par exemple ici).

Voici, exposé en quelques étapes simple, comment réaliser cela dans un squelette spip.

Longueur d’un champ

Pour compter très simplement le nombre de signes dans un champ, ajoutez ceci dans votre squelette à l’endroit où vous souhaitez placer l’information.

[(#TEXTE|textebrut|strlen)]

Quelques explications :

  • Le filtre textebrut supprime les balises html et autres broutilles qui ne rentrent pas en ligne de compte dans le chiffre que nous souhaitons obtenir.
  • Comme toute fonction php, strlen peut-être utilisée comme filtre spip. Le cas présent est très simple puisqu’un seul paramètre est requis par la fonction.
  • Notez qu’il est essentiel de respecter l’ordre des filtres : le texte doit passer par textebrut avant le comptage des signes.

Sans les blancs

Rigoureusement parlant, nous venons de compter les signes d’un champ. Nous pouvons aussi compter seulement les caractères (soit les signes sans les blancs).

Pour ce faire, on commence par créer un filtre supprimer_blancs ad hoc, à placer dans le fichier mes_fonctions.php3 (à créer, si nécessaire, dans la racine de votre spip).

function supprimer_blancs($texte) {
	return trim(ereg_replace("[[:space:]]","",$texte));
}

Il ne reste plus qu’à appeler ce filtre dans votre squelette.

[Il y a (#TEXTE|textebrut|supprimer_blancs|strlen) caractères dans le champ TEXTE.]

Longueur d’un article

Pour compter non plus la longueur d’un seul champ, mais la longueur de tout un article, le plus simple est sans doute d’utiliser une ligne de php directement dans le squelette :

Il y a <?php
echo [(#SURTITRE|textebrut|strlen)]
+ [(#TITRE|textebrut|strlen)]
+ [(#SOUSTITRE|textebrut|strlen)]
+ [(#CHAPO|textebrut|strlen)]
+ [(#TEXTE|textebrut|strlen)]
+ [(#PS|textebrut|strlen)]
+ [(#NOTES|textebrut|strlen)]; ?>
signes dans cet article.

De même, si vous ne voulez compter que les caractères, sans inclure les blancs, il suffit de placer ceci dans votre squelette (sans oublier de placer le filtre supprimer_blancs dans votre fichier mes_fonctions.php3).

Il y a <?php
echo [(#SURTITRE|textebrut|supprimer_blancs|strlen)]
+ [(#TITRE|textebrut|supprimer_blancs|strlen)]
+ [(#SOUSTITRE|textebrut|supprimer_blancs|strlen)]
+ [(#CHAPO|textebrut|supprimer_blancs|strlen)]
+ [(#TEXTE|textebrut|supprimer_blancs|strlen)]
+ [(#PS|textebrut|supprimer_blancs|strlen)]
+ [(#NOTES|textebrut|supprimer_blancs|strlen)]; ?>
caract&egrave;res dans cet article.

Nombre de mots

Il est aussi possible de compter le nombre de mots contenus dans un champ.

Pour ce faire, nous allons retirer du texte tout ce qui risquerait d’interférer dans le comptage : ponctuation, appel de notes de bas de page, espaces excédentaires,... C’est l’objet des fonctions supprimer_notes et supprimer_ponctuation. Ensuite, il suffit de placer chaque mot dans un tableau et de retourner la taille du tableau, ce que fait la fonction nombre_de_mots, qui peut être appelée comme filtre depuis un squelette. Enfin, la fonction number_format_fr permet d’afficher les nombres obtenus en espaçant les milliers avec des espaces insécables.

# Compte le nombre de mots contenus dans un champ
# Nécessite supprimer_ponctuation et number_format_fr
# Auteur: François Schreuer <francois <at> schreuer.org>
# Licence GPL
function nombre_de_mots($texte) {
	$texte = supprimer_ponctuation($texte);
	// On met tout dans un tableau en séparant par espaces
	$tableau = explode(" ", $texte);
	// On compte le nombre d'éléments contenus dans le tableau
	// on formate le nombre obtenu et on renvoie
	return number_format_fr(count($tableau));
}

# Retirer toute ponctuation
# Utile pour nettoyer du texte avant de la passer dans un compteur
# Auteur: François Schreuer <francois <at> schreuer.org>
# Licence GPL
function supprimer_ponctuation($texte) {
	// On supprimes les balises html
	$texte = textebrut($texte);
	// On change les apostrophes en espaces normaux
	$texte = str_replace("'"," ",$texte);
	$texte = str_replace("'"," ",$texte);
	// On supprime les notes de bas de page
	$texte = supprimer_notes($texte);
	// On supprime tout le reste de la ponctuation
	$texte = str_replace('«','',$texte);
	$texte = str_replace('»','',$texte);
	$texte = str_replace('"',''",$texte);
	$texte = str_replace('“','',$texte);
	$texte = str_replace('”',',$texte);
	$texte = str_replace('„','',$texte);
	$texte = str_replace('-','',$texte);
	$texte = str_replace('&mdash;',',$texte);
	$texte = ereg_replace('[[:punct:]]','',$texte);
	// On remplace les espaces multiples se suivant par un seul et on renvoie le tout
	return trim(ereg_replace('[[:space:]]+',' ',$texte));
}

# Petit filtre assez particulier: supprimer les appels de note dans
# un texte préalablement passé par "textebrut" ou "couper"
# ATTENTION: cette fonction doit être adaptée si vous avez
# personnalisé vos notes de bas de page
# Auteur: François Schreuer <francois <at> schreuer.org>
# Licence GPL
function supprimer_notes($texte) {
	return ereg_replace(' \[([0-9]+)\]', '', $texte);
}

# Version améliorée de number_format (format français + séparation avec des insécables)
# Auteur: François Schreuer <francois <at> schreuer.org>
# Licence GPL
function number_format_fr($nb,$dec=0) {
	return str_replace("-","&nbsp;",number_format($nb, $dec, ',', '-'));
}

De la même façon qu’on avait procédé pour le comptage des signes, on peut donc afficher le nombre de mots d’un article, tous champs confondus, de la manière suivantes.

Il y a <?php
echo [(#SURTITRE|nombre_de_mots)]
+ [(#TITRE|nombre_de_mots)]
+ [(#SOUSTITRE|nombre_de_mots)]
+ [(#CHAPO|nombre_de_mots)]
+ [(#TEXTE|nombre_de_mots)]
+ [(#PS|nombre_de_mots)]
+ [(#NOTES|nombre_de_mots)]; ?>
mots dans cet article.

Discussion

4 discussions

  • Bonjour,

    Avec un Spip 4.1, serait-il possible de limiter la saisie du nombre de caractères du champ texte dans l’espace privé ?

    Répondre à ce message

  • Pour compter le nombre de mots en 2022 : [(TEXTE|str_word_count)]

    Répondre à ce message

  • Sur le sommaire j’affiche le chapo et s’il n’existe pas le texte filtré avec couper_mot. Dans les 2 cas, je met un lien sur l’article.
    Si le texte est court je voudrais afficher l’article en entier sans mettre un lien sur l’article ..

    Auriez vous une idée de la boucle ?
    merci

    Répondre à ce message

  • 5
    Bernard

    Serait il possible d’adapter cette contrib pour obliger les redacteurs à ne pas dépasser 2500 caractères tout compris lors de la rédaction d’un article..
    Ceci pour éviter les pages au kilomètres ;o)
    Merci d’avance

    • François

      Salut,

      Serait il possible d’adapter cette contrib pour obliger les redacteurs à ne pas dépasser 2500 caractères tout compris lors de la rédaction d’un article..
      Ceci pour éviter les pages au kilomètres ;o)

      Pas vraiment ou enfin si — tout est possible —, mais alors ce ne sera pas une « adaptation » de la présente contrib, qui se contente de traiter les données pour les afficher dans l’espace public.

      Cela dit, c’est une vraie usine à gaz que de vouloir empêcher les rédacteurs de poster au-delà d’un certain nombre de signes, qui risque en plus de se révéler assez embêtante à l’usage (parce que bon, 2500 signes, c’est court, hein). Est-ce qu’il ne vaut pas mieux en parler avec les rédacteurs via le forum interne ou via une annonce interne ?

      Ce qui serait peut-être utile, par contre, c’est de connaître la longueur des articles dans l’interface privée (et ça c’est assez facile à faire — il suffit de patcher ecrire/articles.php3).

      François

    • En fait j’ai tenté ça, mais ça me bloque uniquement si je veux retoucher l’article, donc ce n’est pas bon.

      if(strlen($texte)>2500)
      {
      exit('trop de caractères');
      }
      echo substr($texte,0,2500); //ne prend que les 2500 premiers caractères

      En fait ta proposition ne peut s’appliquer dans mon cas.
      J’ai beaucoup d’auteurs (site de littérature) et ceux ci sont incorrigibles ! _ Pas moyen de les limiter ! Il me font des romans et cela je n’en veux pas. Je veux une page au format écran ou presque.
      Il me faut donc limiter les caractères lors de la saisie et si possible faire apparaitre un petit compteur du nombre de caractères restants.
      Pour ceux qui auraient envie de faire une contrib interessante ! Je ne suis pas assez bon en php..
      Mais je te remercie néanmoins pour ta réponse rapide.

    • Ca y’est j’ai trouvé un système ! Dans articles.php3 (spip 1.8.1) après la ligne 1601 je rajoute mon code ainsi :

      //
      // "Demander la publication"
      //
      if(strlen($texte)>2500)
      {
      exit('Vous avez dépassé 2500 caractères! Veuillez modifier votre texte et le réduire avant de pouvoir le proposer');
      }
      echo substr($texte,0,2500); //ne prend que les 2500 premiers caractères

      Ainsi si le redacteur dépasse 2500 caractères il ne peut pas proposer son texte à la publication. Il lui faut retoucher son article et passer en dessous du nombre butoir pour pouvoir reproposer son texte.
      J’imagine que ma solution est un peu archaïque, mais je débute en php.
      j’aimerai toutefois trouver la solution pour afficher un compteur de caractères qui s’incremente lors de la saisie et qui bloque tout à 2500 caractères, ce serait plus élégant.

    • J’imagine que ma solution est un peu archaïque

      Oui, de fait. Utiliser un « exit » en plein milieu du code, c’est quand même assez violent (j’imagine que le pied de page ne s’affiche pas, voire que l’aspect graphique de la page est un peu chamboulé ?).

      Sur le fond, je reste très moyennement convaincu de l’utilité d’imposer une limite aussi sévère aux rédacteurs (tu n’a pas peur que ça les fasse fuir ?), mais bon, ça c’est ton problème.

      François

    • Non tout est impeccable.. L’exit arrive après un « if » donc la violence est modérée ;o)
      Par contre cela ne fonctionne pas sous 1.8.2. Si ça interesse quelqu’un j’ai la solution pour la 1.2

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom