IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage PHP Discussion :

compter et couper des mots selon leur longueur et ajouter un *


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut 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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    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

    Si la discussion est résolue, merci de cliquer sur le bouton

  3. #3
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    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)
    Par défaut
    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
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    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

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Invité
    Invité(e)
    Par défaut
    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 éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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)
    Par défaut
    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 : Нииомтплабопармбетзелбетрабсбомонимонконотдтехстромонт.
    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) !
    Dernière modification par Invité ; 15/05/2020 à 19h40.

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    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

    Si la discussion est résolue, merci de cliquer sur le bouton

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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 éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    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

    Si la discussion est résolue, merci de cliquer sur le bouton

  14. #14
    Membre régulier
    Homme Profil pro
    HobbyWeb
    Inscrit en
    Janvier 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : HobbyWeb

    Informations forums :
    Inscription : Janvier 2005
    Messages : 183
    Points : 102
    Points
    102
    Par défaut
    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)
    Par défaut
    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 éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. déplacer des fichiers selon leur extension
    Par chicabonux dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 12/10/2009, 16h42
  2. Lire des fichiers selon leur nom
    Par guiguilelotois dans le forum LabVIEW
    Réponses: 4
    Dernier message: 18/05/2009, 13h55
  3. Compter l'apparition des mots
    Par blackmanyo dans le forum Excel
    Réponses: 5
    Dernier message: 13/11/2008, 15h48
  4. [Flash MX] Supprimer des carte selon leurs valeurs
    Par Lenalyon dans le forum Flash
    Réponses: 1
    Dernier message: 01/09/2007, 12h18
  5. taille des textbox selon leur contenu
    Par christi dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/02/2007, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo