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 :

Autoriser [] dans un lien sans gêner le bbcode [RegEx]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Autoriser [] dans un lien sans gêner le bbcode
    Bonsoir ,

    Je souhaiterais sur mon site pouvoir autoriser dans le regex les crochets pour les liens comme par exemple

    https://www.debian-fr.org/search.php...ll&author=&fid[]=1&sc=1&sf=titleonly&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=Rechercher

    Ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $body = preg_replace("/(\r\n|\.| |\(|\[)((https?|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\[\]\.\+!*',~%#]*[a-z0-9\/@=\&\-_\+~%#])/i", "$1<a href=\"$2\" target=\"_blank\" >$2</a>", " $body");
    Cependant il y a des cas de figure ou ça ne fonctionne pas comme lorsque un utilisateur clôture une balise de bbcode à la fin d'un lien ( www.blabla.com?fid[]=10[/b] ); il est prit dans le lien et le bbcode s’applique jusqu'à la fin du message

    Au final le top serait de pouvoir autoriser les crochets mais ne pas les prendre en compte lorsque ils sont suivi d'un slash.

    Avez-vous une solution ?

  2. #2
    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
    La recherche automatique d'adresses dans du texte avec ou sans BBcode est un problème quasi-insoluble et ce même en composant une pattern de 4 pages qui suive à la lettre la RFC 3986 qui décrit la syntaxe des URIs et qui n'est pas forcément suivie.
    En clair, tu viens de tomber sur un os à cause des crochets, mais c'est l'arbre qui cache la forêt.
    La meilleur alternative reste de ne rien faire et de laisser à l'auteur la responsabilité d'encadrer ou pas ses adresses avec les balises adéquates pour en faire des liens.

    Si maintenant tu veux t'acharner dans cette voie, il te faut définir des comportements par défaut pour les cas litigieux (en gros pour le faire le moins mal possible).

    Pour le cas qui t'occupe, le comportement consiste à interrompre l'adresse si une balise bbcode est trouvée.

    On commence par un peu de ménage dans l'expression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern  = "/(\r\n|\.| |\(|\[)((https?|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\[\]\.\+!*',~%#]*[a-z0-9\/@=\&\-_\+~%#])/i";
    pour aboutir à sa forme la plus naïve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '~\b(?:https?|ftp)://\S+~i';
    soit un scheme "http", "https" ou "ftp", suivi de ://, suivi de plusieurs caractères non-blancs (c'est la seule contrainte sur les caractères qui est conservée.)

    On va ajouter à la pattern une zone de définition de sous pattern pour décrire ce à quoi ressemble une balise bbcode (vite-fait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (?(DEFINE)
        (?<tag> [ibu] | url | quote | code | list | \* ) # à compléter
        (?<bbcode> \[ /? \g<tag> (?>[=\s][^]]*)? ] )
    )
    puis on change le quantificateur + en quantificateur paresseux +? et on place une condition (un test avant) pour la fin de l'adresse: (?=\s|\g<bbcode>|\z) (suivi par un caractère blanc, un tag bbcode, ou la fin de la chaîne.) Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $pattern = '~
        (?(DEFINE)
            (?<tag> [ibu] | url | quote | code | list | \* ) # à compléter
            (?<bbcode> \[ /? \g<tag> (?>[=\s][^]]*)? ] )
        )
        \b(?:https?|ftp)://\S+? (?=\s|\g<bbcode>|\z)
    ~ix';
     
    $replacement = '<a href="$0" target="_blank">$0</a>';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Décembre 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse

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

Discussions similaires

  1. Mon site est intégré dans un autre sans autorisation
    Par diatopm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 28/03/2014, 13h59
  2. Réponses: 4
    Dernier message: 14/05/2012, 11h49
  3. Réponses: 4
    Dernier message: 05/04/2012, 18h00
  4. Réponses: 6
    Dernier message: 04/04/2010, 13h02
  5. Lister sous-répertoires dans un Tlistbox (Sans liens)
    Par Brain3D dans le forum Débuter
    Réponses: 4
    Dernier message: 11/03/2009, 21h56

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