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 :

ajouter un . avant path /dir/dir/file.ext


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut ajouter un . avant path /dir/dir/file.ext
    bonjour

    Mes settings
    OS windows 8.1
    http Apache/2.4.7 (Win32)
    php version 5.5.8
    php library : ereg Regex Library Bundled library enabled
    php file : joomla

    ------------------
    j ai dans un fichier html utf8 plusieurs liens href="/css/style.css" ou src="/js/style.js"
    pour les path vers css et js je souhaite avoir href="./css/style.css" ou src="./js/style.js"

    sur le site http://regexr.com/ je copie/Colle dans chaque champs les valeurs suivantes
    expression (modidié)
    (href|src)=\"([^/]*[\w\d/]*[css|js][\w\d]*[.css|.js]*)\"
    text
    href="/css/style.css"
    src="/js/style.js"
    substitution
    $1=".$2"

    tout va bien d'après le site et la capture de la page web suivante
    Nom : devnet_ajout-point.png
Affichages : 110
Taille : 21,9 Ko

    quand j'adapte mon code regexp en php rien ne va
    Warning: preg_replace_callback(): Unknown modifier '*' in
    --règle1: un " doit se faire pécédé par un \ => \" ok
    --règle2: </title> doit avoir \ devant => <\/title> ok

    $data3 = preg_replace_callback(
    '(href|src)*=\"([^/]*[\w\d/]*[css|js|]*[\w\d]*[.css|.js]*)\"',
    function($m) {
    static $id = 0;
    $id++;
    return $m[1].'="'.$m[2].'"';
    },
    $data3);

    faut il configurer le moteur regexp dans php pour supporter les * ?
    merci pour votre aide

  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
    Attaquer un code html comme une simple chaîne de caractères à coup de regex ou directement avec des fonctions de manipulations de chaînes comme str_replace, substr, strtr, strpos ... est une approche casse-figure.

    Le html est un langage structuré mais aussi très permissif quant à sa syntaxe, et de part sa démocratisation importante et les différences de support historiques entre les premiers clients, une extrême tolérance aux erreurs peut être de mise pour les différents clients actuels, ce qui à pour effet que le code html n'est pas toujours formaté de la manière que l'on imagine.

    Par exemple, la valeur d'un attribut n'est pas forcément entre double quotes ", il peut très bien être entre simple quotes ' ou sans quote du tout. Rien non plus n'oblige le = d'être scotché entre l'attribut et sa valeur, il peut y avoir autant de caractères blancs (espaces, tabulations, nouvelles lignes...) que l'on veut, tout en restant parfaitement valide.

    Bref, il y a mille et une raisons de se casser les dents avec une approche de ce type.

    L'alternative consiste à utiliser un parseur html: la classe DOMDocument permet l'analyse automatique d'un code html (ou xml) pour produire une représentation arborescente de celui-ci. Cette arborescence peut ensuite être directement interrogée par le langage de requête xpath 1.0 via une instance de la classe DOMXPath.

    L'intérêt de cette approche est que l'on s'appuie sur la structure du document html sans ce soucier des éventuelles variations syntaxiques. Alors certes, ça demande un apprentissage supplémentaire notamment pour le langage xpath (il faudra bien le faire à un moment ou à un autre de toute façon), mais pas plus que les regex comme tu as pu t'en rendre compte.



    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
    libxml_use_internal_errors(true);
     
    $dom = new DOMDocument;
    $dom->loadHTMLFile('fichier.html', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
     
    $xp = new DOMXPath($dom); // instance de DOMXPath liée à l'instance de DOMDocument: $dom
    $query = '//@href|//@src'; // tout attribut (@ désigne un attribut) href ou (|) src n'importe où (//) dans l'arborescence
     
    $attrNodeList = $xp->query($query); // renvoie une instance de DOMNodeList
     
    foreach($attrNodeList as $attrNode) {
        // $attrNode est une instance de DOMNode
     
        // on remplace / par ./ si l'attribut commence (^ est l'ancre de début de chaîne) par /
        $newAttrValue = preg_replace('~^/~', './', $attrNode->nodeValue);
     
        // on fait la substitution: $attrNode->parentNode désigne le tag dans lequel se trouve l'attribut (c'est son parent dans l'arbre)
        $attrNode->parentNode->setAttribute($attrNode->name, $newAttrValue);
    }
     
    // on enregistre le résultat dans une variable (il est aussi possible de l'enregistrer directement dans un fichier)
    $result = $dom->saveHTML();
    On peut aussi vérifier que l'attribut commence par / directement dans la requête xpath en utilisant un prédicat: $query = '//href[starts-with(., "/")]|//src[starts-with(., "/")]';. De cette manière, plus besoin du preg_replace, il suffit d'écrire: $newAttrValue = '.' . $attrNode->nodeValue;.

    Concernant tes interrogations sur les regex, les erreurs que tu fais sont basiques, donc regarde le tutoriel de Guillaume Rossolini sur le site ou le manuel PHP pour bien comprendre ce que sont les délimiteurs, les classes de caractères et les groupes. Pour tester tes patterns, je te conseille d'utiliser plutôt regex101 ou regex.larsolavtorvik.com qui eux supportent la syntaxe de regex utilisée par PHP (ce n'est pas le cas de RegExr qui est conçu pour Javascript).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/03/2008, 20h10
  2. Determiner Path (Directory or File)
    Par matt8-5 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 05/07/2007, 13h47
  3. ajout d'un path dans le chemin d'execution
    Par foulla002 dans le forum JBuilder
    Réponses: 2
    Dernier message: 25/07/2006, 08h49
  4. Ajout dynamique de champs de type file dans un formulaire !
    Par stitch dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/11/2005, 11h18

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