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 :

preg_replace et interdir une chaine [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut preg_replace et interdir une chaine
    Bonsoir à tous,

    Je suis en train de mettre en place un forum de discussion avec un WYSIWYG.
    Voici mon probleme, je viens de trouver le bout de code ci dessous qui me va très bien pour couper les mots trop long.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function cutLongWords($string,$length='20',$separation=' ')
    {
      return preg_replace('/([^ ]{'.$length.'})/si','\\1'.$separation,$string);
    }
    MAIS, cette fonction me découpe aussi mes mes images, car elles le chemin des images fait plus de 20 caractéres :
    exple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="http://localhost/monsite/images/smileys/MonOeil.png">
    et donc la fonction va me mettre un espace vers
    ima ges/smileys/
    donc l'image ne sera plus afficher.

    Je voulais donc savoir si dans le motif de recherche à l'exemple de [^ ] qui interdit l'espace, on pouvait éviter de chercher une chaine du style (<img src) et (images/smileys)

    Merci pour vos réponses

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut piste
    Salut, je sens que je suis pas loin :
    expression conditionnel, mais c'est pas encore ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('/([^ ]{'.$length.'})(?<!img src)/mi','\\1'.$separation,$string);
    Des idées?

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Pourquoi ne pas le faire en deux temps :
    1. mettre des espaces avec wordwrap()
    2. reconstruire les balises <img> sectionnées, à l'aide d'une regexp

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    salut Kirkis,
    En effet, ce sera la solution que j'adopterai lorsque je serai sur que mon essai en une seule passe n'est pas possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preg_replace('/([^ ]{'.$length.'})(?<!src=)img/mi','\\1'.$separation,$string);

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    En matière d'expressions régulières, la politique "d'une seule passe" est souvent dévastatrice car elle débouche sur des motifs kilométriques.

    Mieux vaut décomposer. Une solution possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function mon_rplc_callback($capture){
      global $arg;
      return  preg_replace('/([^ ]{'.$arg['length'].'})/si', '\\1'.$arg['separation'] , $capture[1]).$capture[2];
    }
     
    function cutLongWords($string, $length='10', $separation=' '){
      global $arg;
      $arg = compact('length', 'separation'); 
      return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $string);
    }
    Cette solution laissera intact le contenu des balises html.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut merci ripat
    Je te remercie,
    La solution que tu m'as donnée me va tout a fait, c'est elle dont j'avais besoin.
    Si j'ai bien compris, tu cherches d'abords tous les motifs qui ne sont pas des balises html <> et ensuite tu testes s'ils sont plus longs que que lenght et si oui on découpe.

    Pourrais tu me commenter le code des motifs qu'il y'a dans preg_replace_callback où m'indiquer (et ce serait mieux un site) où je pourrais me documenter et apprendre, parce que c'est tout neuf pour moi.

    En tout cas merci

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Le motif du preg_replace_callback est une version évoluée du simple:
    • ([^<]*) qui capture en 1 tout ce qui est hors balise
    • (<[^>]+>) capture ce qui se trouve entre < et >


    Ce motif posait problème pour un texte comme:

    Le nombre <b>2</b> est plus petit que <b>4</b> soit 2<4
    Dans 2 <4 le <4 était interprété comme une ouverture de balise html.

    Il a fallu donc recourir aux assertions arrières négatives (negative lookbehind)
    • ((?:(?!<[/a-z]).)*) capture tout caractère non directement suivit par un <[a-z]
    • ([^>]*>) le même que celui du motif simplifié.


    Pour un tuto, il y en a sur ce forum.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Encore une fois merci
    Il semblerait que tu sois un pro des expressions reguières
    Je récapépète, en fait ce qui me semblait obsure c'est donc dans le premier motif :

    le ?: qui signifie en fait qu'on pas besoin de capturer le motif si on le trouve,
    par contre, [/a-z] qu'est ce que ca veut dire ?

    Merci d'avance

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut Re: Encore une fois merci
    Citation Envoyé par jojo22222
    [/a-z] qu'est ce que ca veut dire ?
    Tout caractère de a à z ou le caractère /
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    C'est super sympa d'avoir répondu à mes questions.
    Merci
    Je clos le sujet

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/02/2012, 15h48
  2. [RegEx] Problème de preg_replace pour supprimer une partie d'une chaine
    Par vgross dans le forum Langage
    Réponses: 10
    Dernier message: 25/05/2011, 22h15
  3. expressions regulieres - interdire une chaine
    Par Pallando dans le forum Langage
    Réponses: 7
    Dernier message: 22/11/2009, 21h28
  4. [RegEx] Répétition d'une chaine de caractères dans un preg_replace
    Par Bladyy dans le forum Langage
    Réponses: 3
    Dernier message: 19/06/2008, 14h29
  5. Question sur les Regex. interdire une chaine
    Par cysboy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 13h49

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