Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier
    compter et couper des mots selon leur longueur et ajouter un *
    Bonjour,

    C'est fonction ci-dessous fonctionne très bien, cependant, j'aimerais la rendre plus précise et quelle ne coupe pas tout les mots au 4ème caractère. Je souhaiterais couper les mots selon leur nombre de caractère comme suit pour tout englober

    Si le mots clefs fait de 4 à 7 caractères => couper au 4ème en y ajoutant un *
    Si le mots clefs fait de 8 à 13 caractères => couper au 6ème en y ajoutant un *
    Si le mots clefs fait de 14 à 25 caractères => couper au 8ème caractère en y ajoutant un *

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
     
    $keywordClean2 =" Végétal légumineuses une pomme anticonstitutionnellement";// mots clefs
     
    $keywordClean4 = " ";
    $i = 0;
     
    	foreach(explode(' ', $keywordClean2) as $w)
    	{
    		if(mb_strlen($w) > 4)
    		{
    			$keywordClean4 .= substr($w, 0, 4)."* ";
    			$i++;
    		}
    	if($i == 5)
    	break;
    	}
     
     echo"$keywordClean4"; // Vég* lég* pomm* anti*
     
     
     // Je souhaiterais qu'il affiche ceci :  Végé* légumi* pomm* anticons*
     
    // Comment faire pour qu'il coupe en fonction de la longueur du mot clefs ?  Du reste l'accent est compté comme 1 caractère ?		
     ?>


    Merci pour votre précieuse aide
    Yule

  2. #2
    Membre expert
    On peut certainement faire mieux, mais je me suis amusé à chercher une solution :

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    $keywordClean2 = " Végétal légumineuses une pomme anticonstitutionnellement";// mots clefs
     
    $keywordClean4 = " ";
     
    foreach (explode(' ',
        $keywordClean2)
             as
             $w)
    {
    switch(mb_strlen($w))
    {
        case 4 :
        case 5 :
        case 6 :
        case 7 :
            $cut=4;
            break;
        case 8 :
        case 9 :
        case 10 :
        case 11 :
        case 12 :
        case 13 :
            $cut=6;
            break;
        default :$cut=8;
            break;
    }
     $keywordClean4 .= substr($w,
             0,
         $cut) .
         "* ";
     
    }
     
    echo "$keywordClean4"; // Végé* légumi* pomm* anticons*
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  3. #3
    Membre régulier
    Merci ! c'est presque ça..

    Moi il m'affiche * Vég* légum* une* pomm* anticons*

    - Le une qui fait moins de 4 caractères ne devrait pas être pris en compte
    - Vég* = l'* est après 3 caractères et non 4
    - légum* = l'* est après 5 caractère et non 6

    Et il ne tient pas compte des 5 termes maxi
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $keywordClean2 = " Végétal légumineuses une pomme anticonstitutionnellement terrible";// mots clefs
     
    if($i == 5)
    break;


    Merci d'avance
    Yule

  4. #4
    Invité
    Invité(e)
    Bonjour,

    1- Ce n'est pas si difficile de corriger le code de laurentSc, SI ?

    2- https://www.php.net/manual/fr/function.mb-substr.php

  5. #5
    Membre régulier
    Ben malheureusement SI....

    J'ai essayé ceci


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <?php
    $keywordClean2 = " Végétal légumineuses une pomme anticonstitutionnellement terrible";// mots clefs
     
    $keywordClean4 = " ";
     
     
    $i = 0; // ajout yule
     
    foreach (explode(' ',
        $keywordClean2)
             as
             $w)
    {
     
    if(mb_strlen($w) > 4){ // ajout yule
     
    switch(mb_strlen($w))
    {
        case 4 :
        case 5 :
        case 6 :
        case 7 :
            $cut=4;
            $i++; // ajout yule
            break;
        case 8 :
        case 9 :
        case 10 :
        case 11 :
        case 12 :
        case 13 :
            $cut=6;
            $i++; // ajout yule
            break;
        default :$cut=8;
        $i++; // ajout yule
            break;
     
     
    }
     $keywordClean4 .= substr($w,
             0,
         $cut) .
         "* ";
     
    // ajout yule
    if($i == 3)
    break;
     
    }
    }
     
    echo "$keywordClean4";


    J'arrive à

    Vég* légum* pomm* et il devrait m'afficher Végé* légumi* pomm*

    Mais le coup des accents qui compte 1 caractère en plus, je vois pas trop..

    J'ai donc essayé ainsi, ca fonctionne mais ca pas l'air très propre...

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    $keywordClean2 = " Végétal légumineuses deux pomme anticonstitutionnellement terrible";// mots clefs
     
    $keywordClean4 = " ";
     
    $i = 0;
    foreach (explode(' ', utf8_decode($keywordClean2)) as $w)
    {
     
    if(mb_strlen($w) > 4){ // ajout yule
     
    switch(mb_strlen($w))
    {
    	case 4 :
        case 5 :
        case 6 :
        case 7 :
            $cut=4;
    		$i++;
    		break;
     
        case 8 :
        case 9 :
        case 10 :
        case 11 :
        case 12 :
        case 13 :
            $cut=6;
    		$i++;
            break;
     
        default :$cut=8;
    		$i++;
            break;
    }
     $keywordClean4 .= utf8_encode(substr($w, 0, $cut)) ."* ";
     
     
    // yule
    if($i == 4)
    break;
     
    }
    }
     
    echo "$keywordClean4";


    Pour ce résultat : Végé* légumi* pomm* anticons*

  6. #6
    Membre expert
    Ca fait le taf :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    $keywordClean2 = " Végétal légumineuses une pomme anticonstitutionnellement terrible";// mots clefs
     
    $keywordClean4 = " ";
     
    $keywordClean3=explode(' ',$keywordClean2);
    $keywordClean2=[];
    $i=0;
    for ($i=0;$i<6;$i++)
        $keywordClean2[]=$keywordClean3[$i];
     
    foreach ($keywordClean2  as   $w)
    {
        $nothing=false;
        switch(mb_strlen($w))
        {
            case 4 :
            case 5 :
            case 6 :
            case 7 :
                $cut=4;
                break;
            case 8 :
            case 9 :
            case 10 :
            case 11 :
            case 12 :
            case 13 :
                $cut=6;
                break;
            case 14 :
            case 15 :
            case 16 :
            case 17 :
            case 18 :
            case 19 :
            case 20 :
            case 21 :
            case 22 :
            case 23 :
            case 24 :
            case 25 : $cut=8;
                break;
            default :
                $nothing=true;
                break;
        }
     if(!$nothing) $keywordClean4 .= mb_substr($w,0,  $cut) . "* ";    // utiliser mb_substr si des caractères accentués ds la chaîne
     
    }
     
    echo "$keywordClean4"; //  Végé* légumi* pomm* anticons*
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  7. #7
    Invité
    Invité(e)
    Laurent,

    switch/case n'est pas la meilleure option ici.
    if elseif else (avec des conditions x < y) me semble plus adapté.

    4, 8, 14 et 25 peuvent être traités comme des "break-points".

  8. #8
    Expert confirmé
    Une question me brûle les lèvres: que doit-on faire avec un mot qui fait pile 4 caractères? Et les plus de 25 lettres comme: dichlorodiphényltrichloroéthane
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Invité
    Invité(e)
    Citation Envoyé par CosmoKnacki Voir le message
    Une question me brûle les lèvres...
    Vraiment ?


    Là, OUI...


    N.B. (voir ici)
    Avec ses 25 lettres, le mot « anticonstitutionnellement » était le plus long de la langue française.
    Il vient de se faire ravir le titre par « intergouvernementalisations » et ses 27 caractères.

    Les plus observateurs remarqueront qu’il existe pléthore de mots encore plus longs,
    tels que « hexakosioihexekontahexaphobie » (la peur du nombre 666, en 29 lettres)
    ou « cyclopentanoperhydrophénanthrène » (structure chimique cyclique qui entre dans la composition de certaines molécules biochimiques, en 32 lettres),
    mais les termes médicaux et scientifiques ont été écartés de la compétition.
    Et aussi : Le plus long mot du monde possède 195 caractères

    [...]le plus long mot allemand : Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz (loi sur le transfert des obligations de surveillance de l'étiquetage de la viande bovine).
    Mais comme il reste ardu à replacer dans une conversation, on préférera rapidement le remplacer par son sigle : ReÜAÜG.

    Les Russes s'illustrent également dans la création de mots composés : c'est ainsi qu'est entré dans le Guinness des Records ce mot de 54 lettres : &#1053;&#1080;&#1080;&#1086;&#1084;&#1090;&#1087;&#1083;&#1072;&#1073;&#1086;&#1087;&#1072;&#1088;&#1084;&#1073;&#1077;&#1090;&#1079;&#1077;&#1083;&#1073;&#1077;&#1090;&#1088;&#1072;&#1073;&#1089;&#1073;&#1086;&#1084;&#1086;&#1085;&#1080;&#1084;&#1086;&#1085;&#1082;&#1086;&#1085;&#1086;&#1090;&#1076;&#1090;&#1077;&#1093;&#1089;&#1090;&#1088;&#1086;&#1084;&#1086;&#1085;&#1090;.
    Ce géant n'est pourtant qu'un acronyme (comme le sont "ONU" ou "SMS") d'une administration soviétique signifiant "Laboratoire pour des opérations de couverture, de renfort, de béton et de béton armé pour les constructions composites-monolithiques et monolithiques du département de la technologie des opérations du bâtiment assemblé de l’institut de recherche scientifique de l’organisation pour la mécanisation de bâtiment et l’aide technique de l’académie du bâtiment et de l’architecture de l’Union des républiques socialistes soviétiques".

    Mais laissons là les mots allemands et Russes ; le mot le plus long du monde actuellement officialisé dans le Guinness des Records les devance tous de loin.
    Retrouvé sur un document hindou datant du 16è siècle, ce mot composé contient 195 caractères Sanskrits (428 lettres si l'on le transcrit en caractères latins) !

  10. #10
    Membre expert
    Si on exclue les langues étrangères et les mots médicaux ou scientifiques, et pour répondre à jreaux62 et à Cosmo (aucun problème pour le mot abri qui fait pile 4 caractères) :

    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?php
    $keywordClean2 = " abri Végétal légumineuses une pomme anticonstitutionnellement terrible";// mots clefs
     
    $keywordClean4 = " ";
     
    $keywordClean3=explode(' ',$keywordClean2);
    $keywordClean2=[];
    $i=0;
    for ($i=0;$i<6;$i++) :
        $keywordClean2[]=$keywordClean3[$i];
    endfor;
     
    foreach ($keywordClean2  as   $w) :
        $nothing=false;
        $ln=mb_strlen($w);
        if (($ln>=4)&&($ln<=7)) :
                        $cut=4;
        elseif (($ln>=8)&&($ln<=13)) :
                        $cut=6;
        elseif (($ln>=14)&&($ln<=25)) :
                        $cut=8;
        else :
                        $nothing=true;
        endif;
     if(!$nothing) $keywordClean4 .= mb_substr($w,0,  $cut) . "* ";    // utiliser mb_substr si des caractères accentués ds la chaîne
     
    endforeach;
     
    echo "$keywordClean4"; //  abri* Végé* légumi* pomm*
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  11. #11
    Expert confirmé
    Citation Envoyé par jreaux62 Voir le message
    Vraiment ?


    Là, OUI...
    Oh la la, pour un résultat pareil le type a dû distiller ça lui-même dans sa cave en partant d'une base de sciure de bois avec quelques topinambours pour le goût. En tout cas ça doit être un sacré titrage pour s'enflammer à température ambiante. N'empêche, après le mouvement de panique, le type n'a pas l'air contrarié plus que ça; un peu comme s'il avait juste avalé de travers, les autres n'ont pas l'air trop espanté non plus. Il vont probablement en boire un autre pour oublier tout ça.

    Les Russes s'illustrent également dans la création de mots composés
    Après cette vidéo, il est important de le noter.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Expert confirmé
    Citation Envoyé par laurentSc Voir le message
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        $nothing=false;
        $ln=mb_strlen($w);
        if (($ln>=4)&&($ln<=7)) :
                        $cut=4;
        elseif (($ln>=8)&&($ln<=13)) :
                        $cut=6;
        elseif (($ln>=14)&&($ln<=25)) :
                        $cut=8;
        else :
                        $nothing=true;
        endif;
     if(!$nothing) $keywordClean4 .= mb_substr($w,0,  $cut) . "* ";
    En inversant l'ordre des tests et en utilisant des comparaisons strictes, tu obtiendras un code plus concis:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if ( $ln > 13 ): // je ne teste pas si plus de 25 (pas important selon moi)
            $cut = 8;
        elseif ( $ln > 7 ):
            $cut = 6;
        elseif ( $ln > 3 ): 
            $cut = 4;
        else:
            continue; // plus besoin de if ( !$nothing ), je saute au mot suivant
        endif;


    Autre chose, d'après ce que j'ai pu décrypter de l'énoncé, il faut récupérer au max 5 mots qui répondent aux critères (et non récupérer 5 mots et voir ensuite lesquelles parmi eux répondent aux critères). Dans cette perspective, on peut se passer d'une des boucles et en faire une seule qui à chaque tour vérifie qu'on n'a pas dépassé la limite de 5 et qu'il reste encore des mots.

    Aussi, plutôt que de construire une chaîne dans la boucle, moi je peuplerai plutôt un tableau pour ensuite faire un implode après. (ce qui évite de faire traîner un espace après le dernier mot).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  13. #13
    Membre expert
    Citation Envoyé par CosmoKnacki Voir le message
    d'après ce que j'ai pu décrypter de l'énoncé, il faut récupérer au max 5 mots qui répondent aux critères (et non récupérer 5 mots et voir ensuite lesquelles parmi eux répondent aux critères).
    D'accord avec ton décryptage ; d'ailleurs, j'étais très moyennement satisfait de n'obtenir que 4 mots au post #10.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  14. #14
    Membre régulier
    Hello vous tous

    Merci bien pour votre aide dans cette trituration et votre délire "ruskov.."

    Tout bon week-end

    Yule

  15. #15
    Invité
    Invité(e)
    Allez... à moi :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    function tronk_stars($chaine, $max=5)
    {
    	$mots = explode(' ', $chaine);
    	$num = 0;
    	foreach($mots as $i => $mot):
    		if( $num >= $max ): // $max mots à modifier
    			break;
    		else :
    			$ln = mb_strlen($mot);
    			$cut = 0;
    			if ( $ln >= 14 ): // plus de 14
    				$cut = 8;
    			elseif ( $ln >= 8 ): // plus de 8
    				$cut = 6;
    			elseif ( $ln >= 5 ): // plus de 5
    				$cut = 4;
    			endif;
    			if(!empty($cut)): 
    				$mots[$i] =  mb_substr($mot,0,$cut) . '*';
    				$num++;
    			endif;
    		endif;
    	endforeach;
    	return implode(' ',$mots);
    }

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $chaine = "Un abri Végétal anticonstitutionnellement terrible protège des légumineuses, une pomme et des pépins de citrouille";// mots clefs
    echo tronk_stars($chaine, 5);
    ?>

    N.B. Dans l'énoncé, j'ai modifié "4 caractères" -> "5 caractères" (puisque les mots de 4 caractères n'ont pas besoin de *)

  16. #16
    Expert confirmé
    Avec une pattern ancrée au début de la chaîne (modificateur A), il suffit d'exprimer les différents scénarios avec des groupes optionnels imbriqués et de placer des \K aux bons endroits pour préserver les préfixes. preg_filter élimine les items où aucun remplacement n'a été effectué:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $keywords = explode(' ', $str);
    $max = 5;
    $pattern = '~.{4}\K.(?:.\K..(?:\K.{6})?)?.*~uA';
    $selected = preg_filter($pattern, '*', $keywords);
    $result = implode(' ', array_slice($selected, 0, $max));


    Code txt :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    .{4}\K. # 5 caractères, césure à 4
    (?:
        .\K.. # 8 caractères, césure à 6
        (?:
            \K.{6} # 14 caractères, césure à 8
        )?
    )?
    .* # les éventuels caractères restants
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus