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 :

Problème de récupération d'une chaine.


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Problème de récupération d'une chaine.
    Bonjour,

    je souhaite retirer dans ma chaine de caractère tous les height et width et les remplacer par un espace ou les supprimer directement, j'ai pensé tous de suite à str_replace, mais le souci c'est que mon height à une valeur différente à chaque fois, je n'ai jamais vu ça en php, mais sur le net il parle du (.*) pour récupérer les valeurs qui sont entre deux caractères, mais j'ai essayé et sans succès.

    Si quelqu'un à une solution je suis preneur.

    Bonne journée à vous et merci encore

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Pour manipuler du HTML :
    http://simplehtmldom.sourceforge.net

    L'exemple est dans le manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Remove a attribute, set it's value as null!
    $e->href = null;

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    c'est vraiment tu traitement pur et dur, mon code HTML est dans une chaine de caractère, et je souhaite juste virer tous les height qui traine dedans et je pensais qu'avec le str_replace est un bout de code que je connai pas on aurai pu retirer tous les height et les remplacer par un espace.

    Ta librairie j'ai beau essayer de regarder la page j'y comprend pas grand choses

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Thom'Web Voir le message
    c'est vraiment tu traitement pur et dur, mon code HTML est dans une chaine de caractère, et je souhaite juste virer tous les height qui traine dedans et je pensais qu'avec le str_replace est un bout de code que je connai pas on aurai pu retirer tous les height et les remplacer par un espace.

    Ta librairie j'ai beau essayer de regarder la page j'y comprend pas grand choses
    C'est très basique, mais voici quelques pistes :
    $html = str_get_html(tonhtml); // Récupère le DOM
    $html->find('[height]') // Récupère tous les éléments qui ont un attribut height
    etc.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    c'est bon je viens de trouver ma solution, enfaite j'utilise les expression régulière

    donc voici mon code a présent :
    $text_height = ereg_replace('height="([0-9]+)"','',$text);

    et sa marche niquel.

    Merci quand même pour votre aide

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Thom'Web Voir le message
    c'est bon je viens de trouver ma solution, enfaite j'utilise les expression régulière

    donc voici mon code a présent :
    $text_height = ereg_replace('height="([0-9]+)"','',$text);

    et sa marche niquel.

    Merci quand même pour votre aide
    C'est crade, ceci dit... Et tu ne gères pas tous les cas.

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Effectivement tu ne gères pas les chaînes 'px', 'cm' etc après la valeur numérique. Mais si tu maîtrises le code html que tu modifies ça peut suffire.

    D'autre part, SimpleHtmlDom peut être lourd en terme de ressource à l'utilisation...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Effectivement tu ne gères pas les chaînes 'px', 'cm' etc après la valeur numérique. Mais si tu maîtrises le code html que tu modifies ça peut suffire.

    D'autre part, SimpleHtmlDom peut être lourd en terme de ressource à l'utilisation...
    Bof, c'est vraiment tout léger et ça peut servir à plein de choses. Je l'intègre dans quasiment toutes mes applis web, et le code est 20 fois plus clean que si je fichais des tonnes de regexp. À moins de faire un site où les perfs doivent être au centième de seconde, ça vaut le coup amha.

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    C'est pas le code de l librairie qui peut s'avérer lourd. En effet c'est un court fichier, j'étais étonné.

    Mais charger en mémoire un gros fichier html peut vite bouffer de la ressource. Je parle pas tellement de la chaîne de caractères mais de la structure objet chargée...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    C'est pas le code de l librairie qui peut s'avérer lourd. En effet c'est un court fichier, j'étais étonné.

    Mais charger en mémoire un gros fichier html peut vite bouffer de la ressource. Je parle pas tellement de la chaîne de caractères mais de la structure objet chargée...
    Euh ça chargerait seulement sa chaîne de caractères en mémoire, exactement comme un appel à preg_replace le ferait.

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Je ne cherche pas à dénigrer l'utilisation de librairie hein

    Juste que si tu ne cherches qu'à faire un preg_replace parce que tu as la maîtrise de la chaîne à analyser tu n'as pas besoin de tout ça :


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    // get html dom form string
    function str_get_html($str, $lowercase=true) {
        $dom = new simple_html_dom;
        $dom->load($str, $lowercase);
        return $dom;
    }
    
    class simple_html_dom {
        public $root = null;
        public $nodes = array();
        public $callback = null;
        public $lowercase = false;
        protected $pos;
        protected $doc;
        protected $char;
        protected $size;
        protected $cursor;
        protected $parent;
        protected $noise = array();
        protected $token_blank = " \t\r\n";
        protected $token_equal = ' =/>';
        protected $token_slash = " />\r\n\t";
        protected $token_attr = ' >';
        // use isset instead of in_array, performance boost about 30%...
        protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);
        protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);
        protected $optional_closing_tags = array(
            'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),
            'th'=>array('th'=>1),
            'td'=>array('td'=>1),
            'li'=>array('li'=>1),
            'dt'=>array('dt'=>1, 'dd'=>1),
            'dd'=>array('dd'=>1, 'dt'=>1),
            'dl'=>array('dd'=>1, 'dt'=>1),
            'p'=>array('p'=>1),
            'nobr'=>array('nobr'=>1),
        );
    
        function __construct($str=null) {
            if ($str) {
                if (preg_match("/^http:\/\//i",$str) || is_file($str)) 
                    $this->load_file($str); 
                else
                    $this->load($str);
            }
        }
    
        function __destruct() {
            $this->clear();
        }
    
        // load html from string
        function load($str, $lowercase=true) {
            // prepare
            $this->prepare($str, $lowercase);
            // strip out comments
            $this->remove_noise("'<!--(.*?)-->'is");
            // strip out cdata
            $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
            // strip out <style> tags
            $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
            $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
            // strip out <script> tags
            $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
            $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
            // strip out preformatted tags
            $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
            // strip out server side scripts
            $this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
            // strip smarty scripts
            $this->remove_noise("'(\{\w)(.*?)(\})'s", true);
    
            // parsing
            while ($this->parse());
            // end
            $this->root->_[HDOM_INFO_END] = $this->cursor;
        }
    
        ...
    
        protected function remove_noise($pattern, $remove_tag=false) {
            $count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
    
            for ($i=$count-1; $i>-1; --$i) {
                $key = '___noise___'.sprintf('% 3d', count($this->noise)+100);
                $idx = ($remove_tag) ? 0 : 1;
                $this->noise[$key] = $matches[$i][$idx][0];
                $this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));
            }
    
            // reset the length of content
            $this->size = strlen($this->doc);
            if ($this->size>0) $this->char = $this->doc[0];
        }
    
        ...
    }

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 144
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Je ne cherche pas à dénigrer l'utilisation de librairie hein
    La seule chose que je dis c'est qu'utiliser un parseur de HTML pour parser du HTML ça me paraît adapté.

    Après ça dépend si c'est un besoin hyper isolé/simple (auquel cas pourquoi pas une regexp) ou quelque chose de plus complexe/fréquent.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2010, 16h10
  2. Réponses: 2
    Dernier message: 13/09/2006, 18h39
  3. problème d'accent dans une chaine
    Par dom_dev dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 10h33
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. [CR] Récupération d'une chaine (Formule)
    Par theclear dans le forum Formules
    Réponses: 6
    Dernier message: 02/07/2004, 11h19

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