[Résolu] RegEx

iLandesiLandes Membre
août 2017 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


Je cherche à  enlever des balises avec Regex mais ça ne marche pas 


 


J'ai récupéré cela:



extension String {
    
    mutating func stringByRemovingRegexMatches(pattern: String, replaceWith: String = "") {
        do {
            let regex = try NSRegularExpression(pattern: pattern,
                                                options: NSRegularExpression.Options.caseInsensitive)
            let range = NSMakeRange(0, self.characters.count)
            self = regex.stringByReplacingMatches(in: self,
                                                  options: [],
                                                  range: range,
                                                  withTemplate: replaceWith)
        } catch {
            return
        }
    }
    
}

Et je l'utilise comme ça :



 var s = "<P>Merci à  notre secrétaire pour ces magnifiques photos !!!</P></p><div class=\"powerpress_player\" id=\"powerpress_player_9462\"><audio class=\"wp-audio-shortcode\" id=\"audio-1092-3\" preload=\"none\" style=\"width: 100%;\" controls=\"controls\"><source type=\"audio/mpeg\" src=\"https://www.dvrgv.org/_Interviews/2017-06-19-LesAbeillesEtDaniel.mp3?_=3\" /><a href=\"https://www.dvrgv.org/_Interviews/2017-06-19-LesAbeillesEtDaniel.mp3\">https://www.dvrgv.org/_Interviews/2017-06-19-LesAbeillesEtDaniel.mp3</a></audio></div><p class=\"powerpress_links powerpress_links_mp3\">Podcast: <a href=\"https://www.dvrgv.org/_Interviews/2017-06-19-LesAbeillesEtDaniel.mp3\" class=\"powerpress_link_pinw\" target=\"_blank\" title=\"Lire dans une autre fenêtre\" onclick=\"return powerpress_pinw('https://www.dvrgv.org/?powerpress_pinw=1092-podcast');\" rel=\"nofollow\">Lire dans une autre fenêtre</a> | <a href=\"https://www.dvrgv.org/_Interviews/2017-06-19-LesAbeillesEtDaniel.mp3\" class=\"powerpress_link_d\" title=\"Télécharger\" rel=\"nofollow\" download=\"2017-06-19-LesAbeillesEtDaniel.mp3\">Télécharger</a></p>"
        
        
        let r = "<div class=\"powerpress_player\""
        let r1 = "<div class=\"powerpress_player\"\\b[^>]*>(.*?)\\/div>"
        
        
        
        s.stringByRemovingRegexMatches(pattern: r)
        print (s)
        

Avec r ça marche mais pas avec r1.


 


J'ai vérifié r1 avec le site http://regexr.com


Mots clés:

Réponses

  • Peut être avec cela



    let r1 = "<div class=\"powerpress_player\".*?<\\/div>"
  • CéroceCéroce Membre, Modérateur

    Je ne peux m'empêcher de citer cette blague archi-connue: "J'avais un problème. J'ai utilisé les RegEx pour le résoudre. Maintenant, j'ai deux problèmes!"


     


    Je ne saisis pas exactement ce que tu essaie de faire? Retirer la balise powerpress_player et tout son contenu ?


    Je n'ai pas réussi sur regexr.com avec r1.


     


    Personnellement, à  ce niveau, je crois que je parserais directement le XML pour retirer la balise. Les RegEx ne me paraissent pas le bon outil ici.



  • let sAttr = try! NSAttributedString.init(data: s.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType], documentAttributes: nil)

    ça ne te va pas ça ?


    Tu peux faire ensuite :



    let sClean = sAttr.string
  • Petit point explication.


     


    Je récupère de l'HTML sous forme de String et je souhaite supprimer ce qu'il y a entre les balises "<div class=\"powerpress_player\" et "</div>". Bien sûr je veux garder toutes les autres balises HTML.


     


    J'a fais des essais avec le code du premier post et là  j'essaye avec une bibliothèque trouvée sur Cocoapod : https://github.com/crossroadlabs/Regex. Ca marche beaucoup mieux mais je galère à  formuler l'expression RegEx.


     


    Voici un extrait de mon texte:


     


    "<img width="300" src="https://www.dvrgv.org/PhotosArticles/2017-07-25-VeloTaxi.jpg"alt="Manu dans le vélo-taxi, Brigitte aux commandes" /><br />


    <P>En juillet 2017, Brigitte décide de franchir le pas. En adéquation avec ses convictions personnelles, elle s'installe en auto-entreprise, comme prestataire de vélo-taxi, sur la commune de Saint-Marcellin. Une balade en centre-ville, un rendez-vous chez le médecin, une visite chez votre ami(e), un départ ou un retour de voyage, Brigitte et son 3 roues, sillonnent les rues du centre-ville.</P><br />

    <P>sur un coup de tête, ou sur une réservation, laissez-vous tenter par une balade au grand air !</P></p>

    <div class="powerpress_player" id="powerpress_player_9779"><!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->




  • Personnellement, à  ce niveau, je crois que je parserais directement le XML pour retirer la balise. Les RegEx ne me paraissent pas le bon outil ici.




     


    Ca je ne vois pas comment faire...

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu n'as pas pensé de faire un substring jusqu'à  l'index de "<div" ?


  • iLandesiLandes Membre
    août 2017 modifié #8

    Si j'y ai pensé mais ça me parait plus compliqué surtout qu'il peut y avoir plusieurs fois le même contenu à  enlever dans mon contenu.


     


    J'y suis presque avec le RegEx mais que c'est chiant


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu peux utiliser string.components(separatedBy: _) pour le trancher d'abord ?


  • Le pattern de @Lexxis semble fonctionner, à  une modification près.


    Le tien (r1) foire de mes tests rapides pour deux raisons : La première c'est le \b, il n'y a pas de raison d'être là .

    Et la seconde, c'est la même que celui de @Lexxis.


    Les patterns proposés ne gèrent pas les sauts de lignes.


    J'ai c/c ton texte entier dans un Regex Online (j'utilise Regex101) et on remarque clairement qu'en supprimant le changement de ligne entre <![endif]--> et <audio class=, cela semble mieux fonctionner. Parce que  " .*? " c'est : "matches any character (except for line terminators)"


  • Pour les "line breaks" il devrait être possible de la prendre en compte en changeant le "." dans le pattern par "[\s\S]".


  • Merci @Lexxis et aux autres contributeur, mon problème est résolu  :D   :D


Connectez-vous ou Inscrivez-vous pour répondre.