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

JavaScript Discussion :

Mode multiline et option ungreedy ?


Sujet :

JavaScript

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Mode multiline et option ungreedy ?
    Bonjour,

    Après une bonne prise de tête pour récupérer le texte (sur plusieurs lignes) contenu
    dans une balise div, je me suis aperçu que le mode multiline ne fonctionnait pas
    toujours notamment sous FF. Donc exit l'option m.

    Suite à des recherches j'ai trouvé un code qui contourne le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var div_content = /<div class="maclasse">([^þ]*)<\/div>/i;
    Le truc consiste à cibler tous les caractères exceptés ceux qui n'ont, à priori, aucune chance d'apparaitre
    dans la chaine. ici en l'occurence: þ

    Voici mon code:

    Texte à matcher:
    <div class="maclasse">
    contenu du div maclasse
    </div>

    <div class="uneclasse">
    contenu du div uneclasse
    </div>
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var div_content = /<div class="maclasse">([^þ]*)<\/div>/i;
    		  var result = data.match(div_content);
    		  alert (result[1]);
    Ce qui m'affiche le résultat suivant:
    contenu du div maclasse
    </div>

    <div class="uneclasse">
    contenu du div uneclasse
    c'est presque bon sauf qu'au lieu de s'arrêter au 1er </div> après <div class="maclasse">, il
    continue jusqu'au bout.

    Y a t-il une équivalence de ungreedy (U) comme en PHP ?
    Je sais qu'il y a l'option g, mais que je la mette ou pas le résultat est le même.

    Quelqu'un pourrait-il maider ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Curieusement hormis le fait que IE sorte le tag div en majuscules il semblerait que les quotes dans les tags posent aussi problèmes
    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
    <script >
    function bar(){
    chaine=document.getElementById('foo').innerHTML.replace(/\r|\n/,'')
    reg=new RegExp("<div class=\W*maclasse\W*>([^<]*)<\/div>",'gim')
    reg.exec(chaine)
    alert(RegExp.$1)
    }
    </script >
    </head>
     
    <body onload="bar()">
    <div id="foo">
    <div class="maclasse">
    contenu du div maclasse
    </div>
     
    <div class="uneclasse">
    contenu du div uneclasse
    </div> 
    </div>
    </body>
    P.S le replace \r\n est inutile ça fonctionne tout aussi bien sans le modifier m est actif

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    ha oui et entre FFX qui reconnait " mais pas \W et IE inversement

    Voici une bidouille qui fonctionne pour les deux:

    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
    <script >
    function bar(){
    chaine=document.getElementById('foo').innerHTML
    reg=new RegExp("<div class=(\"|\W*)maclasse\\1>([^<]*)</div>",'gim')
    result=reg.exec(chaine)
    alert(result[2])
    }
    </script >
    </head>
     
    <body onload="bar()">
    <div id="foo">
    <div class="maclasse">
    contenu du div maclasse
    </div>
     
    <div class="uneclasse">
    contenu du div uneclasse
    </div> 
    </div>
    </body>

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reg=/<div class=("|\W*)maclasse\1>([^<]*)<\/div>/gim

    .

  4. #4
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Salut et merci pour ta réponse.

    La regex fonctionne bien, mais je me demande si le <\/div> à la fin
    est vraiment utile car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = /<div class=("|\W*)media\1>([^<]*)/gim;
    fonctionne également puisque [^<] arrête le match au 1er chevron.

    Cependant, ça ne marche qu'avec du texte. Je ne l'ai pas précisé
    mais il y a également des balises à l'intérieur du div, ce qui
    fait que la regex ne fonctionne plus avec par ex:
    contenu du div <b>maclasse</b>
    le résultat s'arrête à "div".

    J'imagine que le truc serait d'exclure la chaîne </div mais je n'y
    arrive pas. J'ai essayé avec le test avant positif et négatif mais
    je ne m'en sort pas.

    Quelle serait la bonne syntaxe ?

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Toujours avec mon problème.
    pour le résoudre il faudrait exclure le caractère "<" seulement s'il est
    suivit de "/div>"
    Avec un test avant positif ça donnerait:
    mais comment concaténer les 2 expressions ??????
    J'ai essayé dans tous les sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var reg = /<div class=("|\W*)media\1>([^<](?=\/div>)*)/gim;
    var reg = /<div class=("|\W*)media\1>([^<(?=\/div>)]*)/gim;
    var reg = /<div class=("|\W*)media\1>([^<]+(?=\/div>)*)/gim;
    et j'en passe et des meilleurs, mais aucune ne marche.

    Heeelp!

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    tu oublies le < ouvrant ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var reg = /<div class=("|\W*)media\1>([^<]+<(?=\/div>)*)/gim;

  7. #7
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Non, ça ne marche toujours pas.
    Il continue de matcher le 1er chevron dans la chaîne peu importe
    ce qu'il y a après.

    C'est quoi le problème ?

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    javascript n'implemente pas les lookarounds ...

  9. #9
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    javascript n'implemente pas les lookarounds ...
    C'est à dire ?

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    (?= en regExp veut dire suivi de ...
    et ben js est pas fortiche pour les prospections "lookarounds"

    pour moi tu te casserais moins la tête à passer par le DOM avec une fontion de type getElementsByClassName comme celle que j'ai mise dans les contribution ou en utilisant la puissance des selecteurs de jquery de sorte à ne faire les replace que dasn du contenu texte hors balises ...

  11. #11
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    et ben js est pas fortiche pour les prospections "lookarounds"
    Je me demande d'ailleurs en quoi il est fortiche.
    (En PHP ça m'a prit 15mn à tout casser).

    Bref, est ce que c'est vraiment impossible de faire ça en regex ?

    Je ne connais que très vaguement le DOM est ce vraiment plus simple ?
    Pourrais tu me montrer un exemple pour mon problème ?

  12. #12
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par tintin72 Voir le message
    Je me demande d'ailleurs en quoi il est fortiche.
    (En PHP ça m'a prit 15mn à tout casser).

    Bref, est ce que c'est vraiment impossible de faire ça en regex ?

    Je ne connais que très vaguement le DOM est ce vraiment plus simple ?
    Pourrais tu me montrer un exemple pour mon problème ?
    Pourquoi parser le HTML à la main via des regexp, c'est sale et en plus pas du tout la bonne facon.

    le dom c'est la représentation OBJET de ton HTML, c'est représenté comme un arbre XML.

    Donc tu as juste quelques fonction à utiliser et c'est torché.

    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
     
    function doStuffOnDivs() {
    	var divs = document.getElementsByTagName('div');
    	var myDiv;
    	var classRe = new RegExp('\\bmaclasse\\b');
    	for (var i=0; i<divs.length; i++) {
    		myDiv = divs[i];
    		if (myDiv.className.match(classRe)) {
    			// myDiv.innerHTML  pour accéder au contenu HTML ou 
    			var html = myDiv.innerHTML;
    			// ou pour accéder au text brut sans avoir les balises HTML intérieures
    			var textbrut = myDiv.textContent || myDiv.innerText;
    		}
    	}
    }

  13. #13
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par tintin72 Voir le message
    Je me demande d'ailleurs en quoi il est fortiche.
    (En PHP ça m'a prit 15mn à tout casser).

    Bref, est ce que c'est vraiment impossible de faire ça en regex ?

    Je ne connais que très vaguement le DOM est ce vraiment plus simple ?
    Pourrais tu me montrer un exemple pour mon problème ?
    Normal que tu as réussi avec PHP, puisque PHP c'est un langage tout cuit avec 3000 fonction aussi inutiles les unes que les autres et que tu ne connais pas suffisament le JS pour arriver à tes fins directement. C'est comme moi si je devais faire du PHP, je n'en ai pas fait depuis 5 ans, et je pense qu'il me faudrait peut-etre une heure pour arriver à mes fins.

    mais normalement, si tu devrais faire ça avec du PHP tu passerais aussi par une classe qui te transforme ton HTML en DOM

  14. #14
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1

  15. #15
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    En effet, en remplaçant le class="media" du div en id="media" ça va encore + vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var content = document.getElementById('media').innerHTML;
    alert(content);
    Reste plus qu'à savoir comment utiliser ça avec l'API de Ckeditor.
    c'est un langage tout cuit avec 3000 fonction aussi inutiles les unes que les autres
    C'est pas parce que tu t'en sert pas qu'elles sont inutiles.
    Ce que je voulais dire c'est qu'elles fonctionnent. J'ai passé un
    max de temps sur cette regex pour m'apercevoir au final que javascript
    ne gère pas les lookarounds... Génial.
    mais normalement, si tu devrais faire ça avec du PHP tu passerais aussi par une classe qui te transforme ton HTML en DOM
    preg_match_all() et la regex qui va bien devrait suffire.
    http://www.expreg.com/pregmatchall.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    preg_match_all('#<div class="media">(.+)</div>#Uis', $txt, $matches, PREG_SET_ORDER);
    echo $div_content = $matches[0][1];

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

Discussions similaires

  1. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  2. [C#] question sur l'option multiline de l'objet Textbox
    Par prez dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/10/2006, 16h52
  3. Réponses: 17
    Dernier message: 17/10/2002, 20h06
  4. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 30/05/2002, 23h05
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 13h21

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