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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Fonction HTML absolutizer


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut Fonction HTML absolutizer
    Une petite fonction qui va changer les urls relatives d'une portion d'html en url absolues.

    S'applique
    - aux attributs href, src et background
    - aux fonction css url() et src() présentes dans les attributs et balises style.

    Si une url commence par une chaîne alphabétique suivi de ":" elle est ignorée (mailto:, http://, ftp://...).

    Je pense que ça peut être amélioré (j'ai fait ça en vitesse). Par exemple, je ne sais pas trop comment ça se passe pour les url commençant par "./" et n'ai donc pas prévu de règle spécifique, votre expérience est la bienvenue.
    Je ne suis pas sur non plus de devoir limité le filtre de protocole aux caractères alphabétique seulement.

    J'attend vos remarques

    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
    function absolutize($html, $base)
    {
    	$base	=	rtrim($base, '/').'/';
     
    	//	href, src, background attributes
    	$html	=	preg_replace('#(<[^>]+(href|src|background)=")(?![a-z]+:)/?([^"]+)"#is', '$1'.$base.'$3"', $html);
    	//	style attributes url(), src()
    	$html	=	preg_replace('#(<[^>]+style="[^"]*(url|src)\([\s\']*)(?![a-z]+:)/?([^)]+)\)#is', '$1'.$base.'$3)', $html);
     
    	//	style tag
    	preg_match_all('#<style[^>]*>([^<]+)#is', $html, $styles);
    	foreach($styles[1] as $style){
    		$html	=	str_replace(
    			$style, 
    			preg_replace('#((url|src)\([\s\']*)(?![a-z]+:)/?([^)]+)\)#is', '$1'.$base.'$3)',	$style),
    			$html);
    	};
     
    	return	$html;
    }
    //	Utilisation :
    $absoluteHtml = absolutize('ma chaîne html', 'http://www.mon-domaine.com');

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Ton appel de fonction se trouve dans ta fonction, met la à l'extérieur

    Sinon, quel peut etre le genre de situations dans lesquelles ta fonction serait utilisée ?

  3. #3
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    Woups j'ai ajouté l'appel directement dans le textarea merci

    Sinon j'ai déjà utilisé ce genre de fonction pour préparer des emailings ou encore pour simuler un genre de proxy (En fait une récupération de page distante, modification, affichage)

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Ca a l'air de marcher à premiere vue

    Par contre, tu devrais prendre en paramètre un fichier et non une chaine de caractère car avec tout les guillemets et autres de ta chaine, ton parametre en prendra un coup dans la g*****

    Idem en sortie tu devrais créer un fichier comme ca tu garderais l'original et la version modifiée

  5. #5
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    Non, je pense qu'il vaut mieux laisser l'envoi d'une string. Dans le cas d'une fonction prenant en paramètre un fichier, si l'on a une string (récup bdd, résultat d'un moteur de template, récupération d'une page distante...) il va falloir créer un fichier pour l'envoyer à la fonction.
    Dans le cas inverse d'une fonction prenant une string en paramètre et qu'on dispose d'un fichier, un file_get_contents est trés rapide.
    Puis je pense que ça n'est pas le rôle de ma fonction de gérer les fichiers, je pense qu'à la limite on pourrait faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    absolutizeFile($filename, $base)
    {
    	if(!is_file($filename))
    		return false;
    	return	absolutize(file_get_contents($filename), $base);
    }

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Dans ce cas là je comprends pas bien l'utilité : un copier coller de mon code HTML dans ta fonction la fera planter à cause des guillemets...

  7. #7
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    Je ne vois vraimens pas pourquoi. Soit tu écris toi même la string dans ton php et donc comme toute string tu vas devoir échapper tes caractères à la main, soit tu récupère ta string depuis une db ou un fichier (ce que ferait en interne la fonction que tu décrit) et là je vois pas ce qui posera problème.

  8. #8
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Mais l'intérêt et de traduire tout un fichier non ? Et le plus long possible sinon cela va plus vite de le faire à la mano. Dans ce cas là, un CTRL+A, CTRL+C puis CTRL+V dans ton premier argument, et pas besoin d'etre devin pour savoir que ca va partir en vrille

    EDIT: désolé mais si on doit tout échapper ou formater avant, quel est l'intéret vu qu'un coller de la $base serait alors bcp plus rapide ?

  9. #9
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    Déjà tu ne peux pas authomatiser le coller de la base (ou alors tu as une fonction de recherche par regex pour gérer les cas spéciaux et au final y a plu de simplicité).
    Après le coup de la string tapé directement dans le php on est d'accord dans la pratique ça le fait pas et ça serait idiot (car autant le faire une fois puis utiliser directement la nouvelle string plutot que de le faire à chaque exe) mais tu as aussi le cas de la db et le cas de la récupération d'une page sur un autre server. Pour la db un exemple tout con serait de permettre l'envois d'une page d'un blog par email, ta page est stockée en db, pourquoi créer un fichier pour enfin la traiter alors qu'on pourrait directement traiter la string récupéré ?
    Je pense sincèrement que ça serait trop restrictif de faire une récupe du fichier directement dans ma fonction.

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    J'ai donc essayé cette contribution, qui faut le dire, très intéressante

    Ayant fait le testeur, et bien le seul chose que j'ai remarqué, c'est que la réécriture ne se fait pas si on utilise une simple quote pour les attributs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href='url_relative.php'>bla bla bla</a>
    L'as tu remarqué ?
    Est ce volontaire de ne pas l'intégrer ?

    J'en ai vraiment rien à te proposer.
    Les Regex ne m'apprécient pas (ou plutôt l'inverse).

    Enfin, si, mais en dupliquant les les lignes, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $html = preg_replace('#(<[^>]+(href|src|background)=\')(?![a-z]+:)/?([^"]+)\'#is', '$1'.$base.'$3\'', $html);

    Mise à part ça, impeccable, très efficace
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  11. #11
    Membre averti
    Avatar de cahnory
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 203
    Points : 401
    Points
    401
    Par défaut
    Alors il est vrai que je l'ai limité au double quotes. J'ai lu qu'un attribut html devait toujours être entre double quote mais maintenant que tu en fait la remarque je me dit que cette règle doit surement varier d'une version d'html à l'autre... je vais regarder ça et ajuster ou non en fonction... quoi que si les browsers l'interprètent il va falloir l'ajouter sinon ça ne sera pas utilisable l'esprit tranquille.

Discussions similaires

  1. La fonction .html() ne me renvoie pas ma balise <script>
    Par cpetitjean dans le forum jQuery
    Réponses: 12
    Dernier message: 15/07/2010, 18h05
  2. Fonction html > xml
    Par Atlantike dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 13/11/2009, 18h27
  3. [Tableaux] Fonction HTML dans requete PHP
    Par wiLBuzz dans le forum Langage
    Réponses: 7
    Dernier message: 20/07/2007, 10h30
  4. recherche fonction HTML TO XML
    Par mims1664 dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2007, 13h37
  5. [MySQL] Supprimer fonction HTML
    Par Babache42 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/03/2007, 19h37

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