[Résolu] RegEx
iLandes
Membre
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:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Peut être avec cela
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.
ça ne te va pas ça ?
Tu peux faire ensuite :
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 />
Ca je ne vois pas comment faire...
Tu n'as pas pensé de faire un substring jusqu'à l'index de "<div" ?
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
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