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 :

Isoler un texte


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut Isoler un texte
    Bonjour,

    J'avoue débuter avec les expressions régulières et j'ai un petit soucis:

    J'ai un texte du genre :

    "Nom: Blabla
    Prenom: blabla, blabla
    Age:2157
    Résidence:chez moi"

    Je souhaite deux choses :

    1.remplacer les mots "Nom:", "Prenom:", "Age:" et "Rédence:" par des icônes et mettre en gras la partie suivant le ":"

    2.pouvoir isoler les mots suivants chacun des mots suscités par un lien cliquable... Avec le soucis qu'il peut y en avoir un, deux ou plus (séparés d'une virgule)

    Je pense que le premeir point est faisable avec les regex mais pour le second, j'ai des doutes...

    Si quelqu'un peut m'aider, j'en serai fort heureux!

    merci d'avance!

    cordialement

  2. #2
    Membre habitué Avatar de denissay
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 103
    Points : 125
    Points
    125
    Par défaut
    Bonjour,
    Si tu sais donner précisémment le résultat souhaités à partir de l'entrée donnée dans ton premier post, ça aidera beacoup à te donner la bonne réponse ;-)
    Une réponse utile vous a aidé ? N'oubliez pas le
    Votre problème est résolu ? N'oubliez pas le

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Alors en fait, je soufaite isoler le "titre" de ce qui suit les deux points pour les envoyer à une fonction qui traitera tout cela...

    En gros envoyer tous les truc du type titre:blabla vers une fonction

    function traitement_donnee(titre as string, blabla as string)

    et cela pour chaque couple :

    Nom:blabla
    prenom:blabla
    age:blabla

    etc...

  4. #4
    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
    Quand tu parles de lien cliquable, pour la ligne Prenom: blabla, blublu, doit-il y avoir un lien pour blabla, blublu ou bien un lien pour blabla et un autre lien pour blublu?

    Sinon tu peux faire un truc comme ça:

    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
    <meta charset="UTF-8"/><pre>
    <?php
    $data = <<<'LOD'
    Nom: Dumontier
    Prénom: Jacques, François
    Age:43
    Résidence: 15, rue du Maréchal Joffre - 17540 Anais
    
    Nom: Wisniewski
    Prénom: Mireille
    Age:72
    Résidence: 8, rue des trois mâts - 92100 Boulogne
    LOD;
     
    function generateLink($value, $context) { // fonction bidon
        return '<a href="'. $value . '">' . $value . '</a>';
    }
     
    $icons = array('Nom'       => 'images/name.gif',
                   'Prénom'    => 'images/forname.gif',
                   'Age'       => 'images/age.gif',
                   'Résidence' => 'images/address.gif');
     
    $pattern = '~^(\pL++):\h*+(.++)~mu';
     
    $result = preg_replace_callback($pattern,
                                    function ($m) use ($icons) {
                                        return '<img src="' . $icons[$m[1]] . '"/> '
                                             . generateLink($m[2], $m[1]); 
                                    }, $data);
     
    echo htmlspecialchars($result);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    [QUOTE=CosmoKnacki;7665132]Quand tu parles de lien cliquable, pour la ligne Prenom: blabla, blublu, doit-il y avoir un lien pour blabla, blublu ou bien un lien pour blabla et un autre lien pour blublu?

    Ce serait cliquable pour le ou les mots suivants, séparés d'une virgule...

    En fait, le soucis est surtout de trouver comment isoler les "titres" et les "mots" suivants les deux points, sachant que chaque ligne se termine par un saut de ligne...

    Je vais essayer ton script...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    JE débute avec les expression régulières...

    tu peux me décoder cette pattern?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '~^(\pL++):\h*+(.++)~mu';
    par avance merci!!

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ~           # délimiteur de regex
    ^           # ancre marquant le début de la ligne
    (           # ouverture du groupe de capture 1
        \pL++   # n'importe quelles lettres répétées 1 fois ou plus
    )           # fermeture du groupe de capture 1
    :           #
    \h*+        # zéro ou plusieurs espaces horizontal
    (.++)       # n'importe quel caractère (sauf un saut de ligne) 1 fois ou plus
    ~           # délimiteur de regex
    m           # modifieur m: ^ marque le début d'un ligne et $ marque la fin
    u           # modifieur u: la chaîne de caractère est traitée comme du utf8
    remarque: les quantificateurs possessifs ++ et *+ ne sont pas essentiels au fonctionnement de la pattern et peuvent être remplacés par leur homologues gloutons, respectivement + et *. Ils ont pour but d'optimiser la recherche en signalant au moteur de regex qu'il n'est pas nécessaire d'enregistrer une quelconque position dans la chaîne en vue d'un éventuel backtracking (une marche arrière caractère par caractère quand le moteur de trouve pas de correspondance) pour la partie concernée.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    c'est vraiment incroyablement puissant les expressions régulières... ca a l'air magique

    Il faut vraiment que je m'y mette plus sérieusement... si mon vieux cerveau peut encore y entendre quelque chose

    Merci beaucoup en tous cas!

    cordialement

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    La ligne 26 me renvoie:
    Parse error: syntax error, unexpected T_FUNCTION in line 26
    J'avoue que je ne comprend pas vraiment la structure, bien que cela ai l'air aussi puissant... j'aurais betement fait un switch en listant les valeurs possibles... ou utilisé un tableau... mais la façon dont tu procèdes semble super chouette, mais je ne la comprends pas

  10. #10
    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
    Ne t'inquiète pas, tu as cette erreur car tu utilises une version de PHP inférieur à la version 5.3. On peut solutionner ça, attend un peu.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  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
    Voilà, je n'ai pas pu tester, mais je pense que ça doit marcher pour les version PHP antérieur à 5.3. Remarque que désormais, la fonction qui crée le lien n'existe plus et est directement intégrée dans le deuxième argument de create_function qui en fait est parsé avec eval() par le moteur zend.

    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
    <meta charset="UTF-8"/><pre>
    <?php
    $data = <<<'LOD'
    Nom: Dumontier
    Prénom: Jacques, François
    Age:57
    Résidence: 15, rue du Maréchal Joffre - 17540 Anais
     
    Nom: Wisniewski
    Prénom: Mireille
    Age:72
    Résidence: 8, rue des trois mâts - 92100 Boulogne
    LOD;
     
    $icons = array('Nom'       => 'images/name.gif',
                   'Prénom'    => 'images/forname.gif',
                   'Age'       => 'images/age.gif',
                   'Résidence' => 'images/address.gif');
     
    $pattern = '~^(\pL++):\s*+(.++)~mu';
     
    $result = preg_replace_callback($pattern,
                                    create_function (
                                        '$m',
                                        'global $icons;
                                         return \'<img src="\'
                                               . $icons[$m[1]]
                                               . \'"/> \'
                                               . \'<a href="\' . $m[2] . \'">\' . $m[2] .\'</a>\';'
                                    ), 
                                    $data);
     
    echo htmlspecialchars($result);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    encore une question :

    comment faire en sorte qu'un truc du genre:

    date de naissance:09/09/1979

    soit pris en compte (sans doute est ce à cause des espaces que cela plantouille)...

    Autre soucis, les cractères accentués ne passent pas...
    exemple :
    Dur�e: 2 heures

  13. #13
    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
    Remplaces \pL++ par [^:]++ ou par [\pL ]++.


    Par sécurité j'ajouterai un trim() autour de $m[1] pour éviter les erreurs.

    Pour ce qui est des accents, c'est un problème de codage de caractères que tu dois solutionner en amont. Regardes du coté de utf8_encode/utf8_decode.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Merci pour tout en tous cas grand maître ...

    Si tu connais un bon boquin / site sur les expressions régulières, accessible à un padawn, je suis preneur

  15. #15
    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
    Tu as des tutoriels sur ce site, le manuel php, et une ribambelle de tutoriels de base sur le net.

    Si tu te sens à l'aise dans la langue de Shakespeare, tu as le "regex cookbook" chez O'Reilly (Je crois qu'il existe en français) et le site http://www.regular-expressions.info/.

    Après pour des connaissances plus avancées, il y a le livre "Mastering regular expression" de Friedl chez O'Reilly (des extraits des anciennes éditions sont disponibles sur google book), le site rexegg.com.

    Pour une documentation exhaustive, il y a bien sûr la documentation de PCRE (le moteur de regex utilisé par PHP) www.pcre.org/pcre.txt

    L'idéal est de s'entrainer et de pouvoir tester ses regex rapidement, c'est possible avec des testeurs online en ajax: regex.larsolavtorvik.com, www.regex101.com.
    ou pas en ajax: regexplanet.com.
    Ils y en a d'autres, les trois cités sont conçus pour les regex en PHP, ce n'est pas le cas de tous les testeurs, en gardant à l'esprit que tous les moteurs de regex ont leur particularité.


    ps: peut-être que \p{Latin} serait plus approprié que \pL dans la mesure où il ne contient que les lettres accentuées ou pas de l'alphabet latin.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2014, 17h29
  2. Réponses: 0
    Dernier message: 26/09/2014, 11h44
  3. [RegEx] Isoler du texte entre balises
    Par adgenodux dans le forum Langage
    Réponses: 11
    Dernier message: 30/03/2013, 19h45
  4. afficher du texte
    Par Mau dans le forum OpenGL
    Réponses: 10
    Dernier message: 24/06/2003, 15h31
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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