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 :

Regexp trouve chaîne qui débute par "motif début" puis "37 lettres et chiffres" puis "motif de fin"


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut Regexp trouve chaîne qui débute par "motif début" puis "37 lettres et chiffres" puis "motif de fin"
    Bonjour à tous,

    j'y suis presque mais je n'arrive pas à trouver la bonne syntaxe

    j'ai ce genre de textes dans un texte plus long et je veux les supprimer :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript">hideAndShow('spoil417a0ffc0ee3ed8010067f8d2d4c6c1a');</script>

    seul "spoil........." change

    du coup j'ai une recherche comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regexp='/<script type=\"text\/javascript\">hideAndShow\(\'[a-zA-Z]{37}\'\);<\/script>/';
    et je l'utilise pour dans une preg_match

    mais il ne me trouve rien...

    j'ai aussi fait avec une regexp plus simple genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regexp='/<script type=\"text\/javascript\" (.*)<\/script>/';
    mais là il ne s'arrête pas toujours bien et me prend souvent plus que la partie <script... à... /script>

    une fois que j'aurais trouvé la bonne regexp, je bouclerai sur mon texte avec un "while"

    Merci pour vos lumières

  2. #2
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    euh je crois que j'ai tout simplement oublié les chiffres désolé !

    je vais tester et je reviens me flageller ensuite

    [Edit]Ben ça marche tout de suite mieux, et avec une paire de parenthèses pour récupérer le contenu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regexp='/<script type=\"text\/javascript\">hideAndShow\(\'([a-zA-Z]{37})\'\);<\/script>/';

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Tu peux te flageller quand même: on n'édite pas du html comme un simple texte avec des regex.
    Le html est flexible mais structuré et le mieux est de s'appuyer sur cette structure pour éviter les âneries comme:
    • rater une balise script parce que son attribut type est manquant ou espacé différemment ou bien sa valeur n'est pas entouré de double quotes.
    • au contraire, trouver un balise script qui n'en est pas une car contenue dans un commentaire html

    Bref, il y a 36 manières que ta pattern échoue ou renvoie un résultat qui ne devrait pas y être. Donc pour éviter la plupart de ces déconvenues tu peux commencer dans un premier temps par filtrer tous les éléments script contenant hideAndShow avec XPath:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $dom = new DOMDocument;
    $dom->loadHTMLFile('file.html');
     
    $xp = new DOMXPath($dom);
     
    $scriptNodes  = $xp->query('//script[contains(., "hideAndShow")]');
    Dans un deuxième temps on s'attaque aux valeurs de la liste de nœuds script pour une vérification plus fine et pour extraire ce qui nous intéresse. Là on peut sortir la regex, mais dans le meilleur des mondes et dans le même ordre d'idées, l'idéal serait pour cette étape d'utiliser un parser JavaScript (Il en existe un mais je crois qu'il est un peu vieillot).

  4. #4
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    Pour mon cas précis, c'est toujours cette structure :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript">hideAndShow('spoil417a0ffc0ee3ed8010067f8d2d4c6c1a');</script>
    avec 'spoil545656454546' qui fait 37 caractères, ce qui me sauve un peu

    la source de mon texte sont les posts d'un forum (qui contiennent un peu de HTML) et ce javascript concerne les spoils (que je supprime), si le posteur s'est amusé à bricoler le contenu du spoil, celui-ci ne marchera pas correctement donc soit il l'a corrigé pour qu'il soit fonctionnel (sinon à quoi bon mettre un spoil), soit il ne l'a pas corrigé, il ne fonctionne pas, son contenu est mal/pas masqué et ça n'est pas un problème si mon script en loupe quelques uns

    je note ta suggestion si un jour j'ai à traiter plus sérieusement des pages HTML

    et je me suis déjà flagellé pour avoir posé une question alors qu'il manquait un élément évident dans mon code

  5. #5
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    La suggestion du DOM n'est pas tombée dans l'oreille d'un sourd
    Remplacement de tous les smileys du forum 1 (codés sous forme de <img src.... /> ) par la version du forum 2 en un tournemain
    Code php : 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
    function replace_smilies($text){
     
            $dom = new DOMDocument('1.0');
            $dom->loadHTML($text);
            $anchors = $dom -> getElementsByTagName('img');
            foreach ($anchors as $element) {
              $class = $element -> getAttribute('class');
              if($class=='smiley'){
                $alt = $element -> getAttribute('alt');
                $src = $element -> getAttribute('src');
                $content_cb='<img src="'.$src.'" alt="'.$alt.'" class="smiley" />';
                $content_phpBB = '<E>'.$alt.'</E> ';
     
                $text = str_replace("$content_cb", "$content_phpBB", $text);
              }
            }
            return $text;
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 78
    Par défaut
    Pour aller plus loin avec cette chouette méthode, comme je peux avoir le contenu de l'élément ?

    Genre j'ai cette magnifique chose imbriquée :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="spoil"><span class="spoil_info" onClick="hideAndShow('spoil08b25f1eae526c28a35f678123f9e041');">Spoiler</span><span class="spoil_spoiler" id="spoil08b25f1eae526c28a35f678123f9e041">hé non <E>:p</E> <span class="spoil"><span class="spoil_info" onClick="hideAndShow('spoilaea7839949497b2365abdab12f5626c0');">Spoiler</span><span class="spoil_spoiler" id="spoilaea7839949497b2365abdab12f5626c0">cherche encore...<span class="spoil"><span class="spoil_info" onClick="hideAndShow('spoil9f23324344969b872e4e89e3786e0868');">Spoiler</span><span class="spoil_spoiler" id="spoil9f23324344969b872e4e89e3786e0868">toujours pas...<span class="spoil"><span class="spoil_info" onClick="hideAndShow('spoildd3d0c5aa0770e2dd642b6fe2ca9b908');">Spoiler</span><span class="spoil_spoiler" id="spoildd3d0c5aa0770e2dd642b6fe2ca9b908">bien caché : <r><YOUTUBE id="1Bn50keR6UY"><s>[media]</s><URL url="https://www.youtube.com/watch?v=1Bn50keR6UY">https://www.youtube.com/watch?v=1Bn50keR6UY</URL><e>[/media]</e></YOUTUBE></r></span></span></span></span></span></span></span></span>
    Je veux me débarrasser de tout ce qui est entre la balise span initiale et la finale

    Je peux faire un :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $dom = new DOMDocument('1.0');
            $dom->loadHTML($text);
            $anchors = $dom -> getElementsByTagName('span');
            foreach ($anchors as $element) {
              $class = $element -> getAttribute('class');
              if($class=='spoil'){
               // je remplace cet élément par rien dans $text
              }
            }
    mais je n'ai pas trop d'idée pour faire mon traitement : " je remplace cet élément par rien dans $text"

    Je le sens bien comme ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $dom = new DOMDocument('1.0');
    $dom->loadHTML($text);
    $anchors = $dom -> getElementsByTagName('span');
    foreach ($anchors as $element) {
      $class = $element -> getAttribute('class');
      if($class=='spoil'){
        $element->nodeValue = "";
      }
    }
    $text = $dom->saveHTML();
    ça fonctionne pas mal sauf que je veux pas rajouter toute la structure d'une page HTML autour de mon $text (ni changer les caractères spéciaux...) faut que je creuse encore...

    [Edit] en ajoutant les options LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD à mon loadHTML, c'est un peu mieux mais il me modifie toutes mes balises en majuscules, syntaxe créée pour le forum 2 qui écrit ses balises de comme ça : <CAUDE><s>[caude]</s>Caude test<e>[/caude]</e></CAUDE>, et il remplace tous mes caractères accentués par leur équivalent HTML, je préférerais éviter.

    Si quelqu'un a une idée

Discussions similaires

  1. Rechercher chaîne de caractère qui commence par un espace
    Par Leticha dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/07/2015, 17h09
  2. REGEX - Savoir si une chaîne commence par un motif
    Par rambc dans le forum Général Python
    Réponses: 3
    Dernier message: 16/07/2011, 15h33
  3. Réponses: 0
    Dernier message: 04/03/2011, 12h16
  4. Réponses: 6
    Dernier message: 15/07/2010, 19h00
  5. [RegExp]Split chaîne par espaces sauf ceux entre guillemets ?
    Par Loic Desjardins dans le forum Langage
    Réponses: 2
    Dernier message: 17/11/2006, 10h33

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