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 :

Passage avec DOM, accepter les chevrons seuls


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut Passage avec DOM, accepter les chevrons seuls
    Bonjour à tous,

    J'ai réalisé un parseur qui permet de transformer du code en HTML. Celui ci est utilisé dans le cadre d'un livre d'or. En d'autres termes, lorsque les gens utilisent le formulaire, les balises sont : <blod>Hello</bold> et mon parseur les transforment en <strong>Hello</strong>.

    Mais j'ai un problème, imaginons que quelqu'un mette ceci :
    "J'aime beaucoup <3". Dom s'attend à trouver un caractère ">" et un tag de fermeture à savoir </3>. Et comme il n'y en a pas, j'ai une belle erreur à l'écran
    Warning: DOMDocument::loadXML(): StartTag: invalid element name in Entity
    et blablabla
    Savez-vous comment je peux gérer ça ???

    Merci

  2. #2
    Membre éprouvé Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Points : 1 174
    Points
    1 174
    Par défaut
    Dans ton cas tu n'as pas 40 solutions. Tu dois replacer tes caractères avant de faire tourner ta fonction.

    Ce que tu peux faire c'est récupérer le contenu du message et faire une petit coup de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     htmlentitties($message);
    De là, tu pourras ensuite parser ton html.
    Agence web Dim'Solution, créateur de solutions numériques
    Sites internet, ecommerce, logiciels, applications mobiles, référencement (SEO), plugin Prestashop, Magento, WordPress, Joomla!...

    Cours de trading gratuit | Envoyer des sms gratuitement | Envoyer des fax gratuitement | Plateforme de Fax à l'international

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    J'ai déjà essayé... Mais si je fais ça, lorsque je passe par le parser, il ne fait rien avec mes balises <gras></gras>, etc. car il remplace aussi ces attributs là !!!

  4. #4
    Membre éprouvé Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Points : 1 174
    Points
    1 174
    Par défaut
    A ce moment là, tu peux c'est récupérer seulement le contenu de ton message et faire un petit coup de regex pour savoir à partir d'où commence ton message et où il fini. Ca te permettra ainsi de récupérer l'intégralité de ton message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function startsWith($haystack, $needle)
    {
        return $needle === "" || strpos($haystack, $needle) === 0;
    }
    function endsWith($haystack, $needle)
    {
        return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
    }


    Quoi qu'en soit la méthode, coder comme ça c'est du grand n'importe quoi. Le jours ou il y a un changement sur ta page, tout crash..

    La "méthode propre" et digne d'un développeur :

    1-/ Récupération du champs message
    2-/ Création d'un tableau associatif pour str_replace()
    3-/ Un fois que tu as remplacer tous tes caractère spéciaux, tu peux ensuite parser.

    Nota: DOMDocument obj est très sensible aux erreurs html, alors replacement bien tes éléments perturbants.
    Agence web Dim'Solution, créateur de solutions numériques
    Sites internet, ecommerce, logiciels, applications mobiles, référencement (SEO), plugin Prestashop, Magento, WordPress, Joomla!...

    Cours de trading gratuit | Envoyer des sms gratuitement | Envoyer des fax gratuitement | Plateforme de Fax à l'international

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    Ok, merci ! Je vais faire la méthode propre et voir si des gens ayant eu le même problème que moi (je ne dois pas être le seul) n'ont pas déjà créer des tableaux associatifs...

    Merci.

  6. #6
    Membre éprouvé Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Points : 1 174
    Points
    1 174
    Par défaut
    Histoire de te mettre sur la piste:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $replace = array(
       '<' => htmlentities('<'),
       '>' => htmlentities('>'),
    )
    Ensuite tu replace seulement dans ton message les chevons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $message = str_replace(array_keys($replace), array_values($replace), $message);
    Il te suffit simplement de faire simple "if" de manière à savoir si ton chevrons est suivit de tes balises ou non. (preg_match)
    Agence web Dim'Solution, créateur de solutions numériques
    Sites internet, ecommerce, logiciels, applications mobiles, référencement (SEO), plugin Prestashop, Magento, WordPress, Joomla!...

    Cours de trading gratuit | Envoyer des sms gratuitement | Envoyer des fax gratuitement | Plateforme de Fax à l'international

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    Ok ! ça fonctionne ! Merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2010
    Messages : 123
    Points : 137
    Points
    137
    Par défaut
    Parce qu'on me l'a demandé et que c'est vrai, ça peut aider d'autres gens, voici le code que j'ai écrit pour permettre à un utilisateur d'utiliser des caractères spéciaux dans un fichier qui va être parsé avec DOM :
    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
     
    private function clean($content) {
    	$vdcode = array(
    		'`&lt;bold&gt;(.+)&lt;/bold&gt;`isU',
    		'`&lt;italic&gt;(.+)&lt;/italique&gt;`isU',
    		'`&lt;underline&gt;(.+)&lt;/underline&gt;`isU',
    		// Et d'autres...
    	);
     
    	$tags = array(
    		'<bold>$1</bold>',
    		'<italic>$1</italic>',
    		'<underline>$1</underline>',
    		// Et d'autres...
    	);
     
    	$content = htmlspecialchars($content, ENT_QUOTES, 'ISO-8859-1');
    	$content = preg_replace($vdcode, $tags, $content);
    	return $content;
    }
    Et pour parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $document = new DOMDocument();
    $content = $this->clean($content);
    $document->loadXML($content);

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

Discussions similaires

  1. [DOM] Récupérer les attributs d'un fichier XML en XPATH AVEC DOM
    Par jean22 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 26/06/2013, 16h02
  2. Réponses: 1
    Dernier message: 23/04/2012, 11h57
  3. [DOM] Question concernant dom et les attributs avec java
    Par zemzoum89 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/09/2010, 20h18
  4. Numériser 2 images en un seul passage avec delphiTwain
    Par ALSCO dans le forum Composants VCL
    Réponses: 0
    Dernier message: 27/02/2008, 09h32

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