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 :

Remplacer URL par des liens sauf dans les balises [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Remplacer URL par des liens sauf dans les balises
    Bonjour à tous,

    J'essais depuis un moment de trouver une REGEX permettant de sélectionner dans un code HTML les URLs non contenu dans les balise HTML.

    Le but étant de l'utiliser dans un preg_replace de PHP pour trouver les URLs isolées d'une page HTML et les entourées d'une balise <a> pour les faire devenir cliquables .

    Voici un exemple de code que je veux traiter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    http://www.mon-url-seule-1.com
    <div style="backgroun-image:url('http://www.monsite.com')">
       <a href="http://www.monsite.com">
          <img src="http://www.monsite.com">
       </a>
       <br />http://www.mon-url-seule2.com<br />
    <div> http://www.mon-url-seule-3.com </div>
    </div>
    Le résultat que je souhaite obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <a href="http://www.mon-url-seule-1.com">http://www.mon-url-seule-1.com</a>
    <div style="backgroun-image:url('http://www.monsite.com')">
       <a href="http://www.monsite.com">
          <img src="http://www.monsite.com">
       </a>
       <br /><a href="http://www.mon-url-seule2.com">http://www.mon-url-seule2.com</a><br />
    <div> <a href="http://www.mon-url-seule-3.com">http://www.mon-url-seule-3.com</a> </div>
    </div>
    Dans tous mes essais, je ne suis pas arrivé à sélectionner uniquement les URL seules...

    Voici ou j'en suis dans ma REGEX : '/(?<!=\")(((f|ht){1}tp(s?):\/\/)[\w-@:%_\+.~#?&;\/\/=]+)/'

    Cette partie fonctionne très bien, mais sélectionne toute les URLs, également celle déjà contenues dans les balises... /(((f|ht){1}tp(s?):\/\/)[\w-@:%_\+.~#?&;\/\/=]+)/

    Et celle ci fait tout capoter... : (?<!=\")

    Merci d'avance pour votre aide, je ne suis pas loin de ne plus avoir assez de cheveux pour continuer de me les arracher lol



    edit : celle ci ne fonctionne pas nomplus ... '/([^\=]"?\s?((f|ht){1}tp(s?):\/\/)[\w-@:%_\+.~#?&;\/\/=]+)/'

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace('/(?<!=")(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/uis','<a href="$1">$1</a>',$html);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Magnifique ! Merci Sabotage pour cette réponse rapide et efficace!

    U R the Guy !

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Oups ! j'ai été un peu vite, cette regex traite cette ligne alors qu'elle ne devrait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="backgroun-image:url('http://www.monsite.com')">
    voilà le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div style="backgroun-image:url('<a href="http://www.monsite.com" target="_blank">http://www.monsite.com</a>')">
    Il n'y aurait pas la possibilité dire à la regex de ne pas traiter tout ce qui ce trouve entre les "<>" ???

    je vais creuser encore, mais je suis déjà bien avancé, encore merci

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Code très légèrement modifié et çà a l'aire de marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace( '/(?<!"|\'|\()(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/uis','<a href="$1">$1</a>',$html);

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Autre problème que j'avais oublié de précisé dans l'énoncé , j'aimerais aussi capturer les adresses de la forme www.monsite.com

    je continue a chercher, mais si quelqu'un a la réponse, je suis preneur

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Je n'ai pas trouvé d'autre solution que de rajouter une regex après ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $regex[0] = '/(?<!"|\'|\()(\b[\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/uis';
    $regex[1] = '/(?<!"|\'|\(|\/)((www.)?[\w-?&;#~=\.\/\@]+[\w\/]{2,5)/uis';
     
    $html = preg_replace($regex,'<a href="$1">$1</a>',$html);

  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 solution consiste à identifier grossièrement les urls potentiels par une pattern basique ( (?>(?>ht|f)tp://|(?>www\.))[^\s<]++ dans mon exemple) puis d'utiliser FILTER_VALIDATE_URL via une fonction de rappel avec preg_replace_callback().

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pattern = '~<(?(?!(a|style|script|title|code)\b)[^>]++>|\1\b(?>[^<]++|<(?!/\1>))++)(*SKIP)(*FAIL)|(?>(?>ht|f)tp://|(?>www\.))[^\s<]++~i';
    $replacement = function($m) {
        if (filter_var($m[0], FILTER_VALIDATE_URL))
            return '<a href="' . $m[0] . '">' . $m[0] . '</a>';
    };
     
    $result = preg_replace_callback($pattern, $replacement, $html);
    La première partie de la pattern (se terminant par (*FAIL)) a pour but d'éliminer les urls comprises dans des attributs ou déjà encadrées par des balises <a href...>...</a>.

    Détails:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <
    (?(?!(a|style|script|title|code)\b)  # si ce n'est pas un balise "a" ouvrante
        [^>]++>                            # alors on continue jusqu'au prochain > inclus
      |                                  # ou alors
        \1\b                               # c'est une balise "a" ouvrante
        (?>                                # et on continue jusqu'à la balise "a" fermante exclue
            [^<]++        
          |
            <(?!/\1>)
        )++
    )
    (*SKIP)                              # la subpattern ne peut réussir,
                                         # mais les caractères seront "consommés"
    (*FAIL)                              # fait échouer la subpattern
    Remarque: la première partie peut être améliorée en ajoutant par exemple le support des <![CDATA].....]]> et des commentaires <!--....-->. Quant à la deuxième, on peut également ajouter le support d'autres protocoles: mailto, news, gopher, telnet...
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Modification des liens odbc dans les tables
    Par SDIS49 dans le forum Connexions aux bases de données
    Réponses: 0
    Dernier message: 25/02/2011, 08h26
  2. [WD-2003] Remplacer des liens Hypertextes dans les zones de texte
    Par Fanlou dans le forum VBA Word
    Réponses: 5
    Dernier message: 10/06/2009, 15h29
  3. [RegEx] Remplacements href par des liens différents
    Par thierry232323 dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2009, 08h38

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