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 :

Regex pour url spéciale


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut Regex pour url spéciale
    bonjour,

    je souhaite faire un regex afin de d'ajouter les balises "<a href></a>" à mes liens.

    Sauf que certains des liens ne sont pas comme d'habitudes. J'ai par exemple des url avec à la fin des "+" et plusieurs "."

    Or le regex que j'ai pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #https?://[a-z0-9._/-]+#i
    s'arrête dès le premier "."

    Or ce n'est pas ce que je veux...

    merci



    edit : on ma conseillé de venir poser ma question içi :
    (cf sujet :http://www.developpez.net/forums/d86...e/#post4952202)

    Je dois récupérer le contenu entre 2 mots

    mais le regex n'est pas bon...

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Je viens de tester un regex trouvé sur developpez.com :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	$text= eregi_replace(
       "(^|[ \t\r\n\(:,]+)?". //punctuation before URL
       //Protocole
       "((ftp|http|https|gopher|mailto|pop|smtp|news|nntp|telnet|wais|".
       "file|imap|prospero|peercast|ed2k|irc|aim|mime|ftam|pnm|rtsp|ldap):".
       "[A-Za-z0-9/](([A-Za-z0-9$|.+!*()\.,;/?:@&~=_-])|%[A-Fa-f0-9]{2})+".
       "[A-Za-z0-9/&#=_-]+)". //valid chars at the end of an URL
       "([\.\),:;? \t\r\n]+([^A-Za-z0-9/&%#=_-]|$))?", //punctuation not followed by valid char
     "\\1<a href='\\2' target=\"blank\">\\2</a>\\6", $text);
    Il me met bien mes liens correctement donc c'est cool, mais en contre-partie j'ai ceci :

    Deprecated: Function eregi_replace() is deprecated in...

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Personne pour m'aider?

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Il faut utiliser les fonctions PCRE (preg_match, etc...).
    Le motif que tu as trouvé s'adapte très facilement, et comme je n'ai pas le temps actuellement, je vais juste te conseiller d'aller voir le manuel.
    Le principe est juste d'ajouter des délimiteurs.

    More on this later.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    ok je vais remplacer eregi_replace par preg_match, et au pire si ça ne marche pas je mettrais un '@' devant pour ne plus afficher cette erreur

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Bon après avoir pas mal tenté, mon regex précédent fonctionne bien pour une url avec "http:" mais pas pour les url qui commence par "www."

    Après j'ai aussi tenté avec preg-replace mais je bloque

    J'aurai besoin de votre aide pour ce petit regex.

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Je vais regarder ça. Pourrais-tu nous passer quelques chaînes de test ?

  8. #8
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    En attendant, voici comment tu pourrais commencer avec les fonctions PCRE

    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
    $str = 'www.free.fr';
     
    $reg = '{^
            [ \t\r\n(:,]*
     
            #protocoles suivi de :// falcutatif
            (
            (?: ftp|http|https|gopher|mailto|pop|smtp|news|nntp|telnet|wais|file|imap|
                prospero|peercast|ed2k|irc|aim|mime|ftam|pnm|rtsp|ldap
            )
            ://)?
     
            # suivis par une lettre ou un chiffre
            [A-Za-z0-9]
     
            # toute une bardée de trucs à vérifier
            # je ne comprends pas pourquoi tout ça
            (
                ([A-Za-z0-9$|.+!*\(\)\.,;/?:@&~=_-])
                |
                %[A-Fa-f0-9]{2}
            )+
     
            ([A-Za-z0-9/&#=_-]+)
     
            (
                [\.\),:;? \t\r\n]+
                [^A-Za-z0-9/&%#=_-]
            )?
            $}x';
     
    preg_match($reg, $str, $m);
     
    print_r($m);

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    En version plus simple, avec dans la variable $valide ce que tu considères comme acceptable entre deux points dans une url.

    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
     
    $str = "Dans cette phrase, j'ai l'url www.free.fr que je veux transformer";
     
    $valide = '[A-Za-z0-9$|.+!*\(\),;/?:@&~=_%-]+';
     
    $reg = "{
            #protocoles suivi de :// falcutatif
            (
            (?: ftp|http|https|gopher|mailto|pop|smtp|news|nntp|telnet|wais|file|imap|
                prospero|peercast|ed2k|irc|aim|mime|ftam|pnm|rtsp|ldap
            )
            ://)?
    
            # ici je fais plus simple
            ( $valide \. )+
    
            $valide
    
            }x";
     
    preg_match($reg, $str, $m);
    print_r($m);
     
    echo preg_replace($reg, '<a href="$0">url</a>', $str);

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Mon regex de départ c'est un regex que j'ai récupérer et non construit.

    J'avais déjà pris auparavant un regex qui fonctionnait pour les liens du genre www.free.fr mais il ne fonctionnait pas pour les liens type "http/" avec une url complexe (des points etc), c'est donc pour cela que j'avais pris ce regex.

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    merci snafu ça marche bien

    Cependant, dès qu'il me trouve un fichier type : index.php il me le met en url ou même si j'ai le titre du paragraphe (1.1.2) il me le met aussi en url

  12. #12
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par piero53 Voir le message
    merci snafu ça marche bien

    Cependant, dès qu'il me trouve un fichier type : index.php il me le met en url ou même si j'ai le titre du paragraphe (1.1.2) il me le met aussi en url
    Ben oui, je m'en doutais...

    Le problème est que tu veux viser très large et que tu ne donnes pas assez de restrictions.

    Il faudrait définir quelques restrictions, en fonction de ton appli :

    - obligation de commencer par (protocole + "://") ou ("www")

    - obligation de finir par une extension parmi un choix fini : com, fr, org, etc...

    Il faudrait trouver le regex validant la RFC 3986
    Cet exemple essaie de s'en approcher :
    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
     
    $reg <<< END
    # Start at the beginning of the text
    /^
    # The scheme
    ([a-z][a-z0-9\*\-\.]*):\/\/
    # Userinfo (optional)
    (?:                                                     
      (?:(?:[\w\.\-\+!$&'\(\)*\+,;=]|%[0-9a-f]{2})+:)*
      (?:[\w\.\-\+%!$&'\(\)*\+,;=]|%[0-9a-f]{2})+@
    )?
    # The domain
    (?:
      # Domain name or IPv4
      (?:[a-z0-9\-\.]|%[0-9a-f]{2})+
      # or IPv6
      |(?:\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\])
    )
    # Server port number (optional)
    (?::[0-9]+)?
    # The path (optional)
    (?:[\/|\?]
      (?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})  
    *)?
    $/xi
    END;

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Points : 105
    Points
    105
    Par défaut
    Ben ouai je sais que je veux viser très large, enfin je m'adapte à ce que je trouve, c'est-à-dire avec des liens qui ne finissent parfois ni par .com ou .fr etc...

    Par contre le dernier regex, je n'avais jamais vu quelque chose comme ça (sans le signe = )

Discussions similaires

  1. [RegEx] PHP - Regex pour URL
    Par bart997 dans le forum Langage
    Réponses: 3
    Dernier message: 09/12/2010, 15h20
  2. regex pour tester un mail ou une URL
    Par rambc dans le forum Général Python
    Réponses: 10
    Dernier message: 23/02/2010, 12h37
  3. Aide pour Regex sur URL un peu spécial
    Par poppyto dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2008, 13h21
  4. [RegEx] regex pour url
    Par temperature dans le forum Langage
    Réponses: 5
    Dernier message: 23/05/2008, 14h43

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