11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour !

Je cherche à supprimer, à chaque fois que cela se présente, tout ce qui est situé après un <br> (que ce soit du texte, une image, un lien...). Par exemple, j'ai :

<div class="last-date">Mer 18 Juil 2018 - 9:06<br>Pekd &nbsp;<a href="/t12-dedfd#42" class="last-post-icon"><img src="https://illiweb.com/fa/empty.gif" alt="Voir le dernier message" title="Voir le dernier message"></a></div>


Dans chaque div class="last-date" , je souhaite donc que ce qui suit <br> soit supprimé (dans l'exemple donné : "Pekd &nbsp;", le lien et l'image). Est-ce possible ?

Merci d'avance et bonne fin de journée Smiley smile
Modifié par holen (25 Jul 2018 - 17:46)
Modérateur
Au hasard ?


let motif = /\<div class="last-date"\>.+(\<br\>.+)\<\/div\>/;
//etc.


- replace
- querySelectorAll
- forEach ou for ... of ou array.prototype.slice.... avec un for
Modifié par niuxe (25 Jul 2018 - 19:25)
@niuxe,

les expressions régulières sont gourmandes par défaut.
Ton expression va chercher le dernier "</div>" dans le document, pas le prochain.
Il n'y a aucun besoin d'échapper les caractères "<" et ">".

J'ai testé l'expression suivante à http://regex101.com et cela a l'air bon:
let motif = /(<div\s[^>]*\bclass="last-date"[^>]*>.*?)<br\s*\/?>.*?<\/div>/
etc...
Salut

Je propose :

const elemsLastDate = Array.from(document.querySelectorAll('.last-date'));

for (const elem of elemsLastDate){
    elem.innerHTML = elem.innerHTML.split('<br>')[0];
}
Meilleure solution
@danielhagnoul

Bonne idée !
Sauf que normalement, pour être rigoureux, on devrait écrire "<br />".
Hélas tout le monde ne fait pas les choses correctement (coucou @holen).
On peut rattraper le coup comme ceci :
elem.innerHTML = elem.innerHTML.split(/<br\s*\/?>/)[0];

Modifié par bazooka07 (26 Jul 2018 - 00:22)
Modérateur
bazooka07 a écrit :

Sauf que normalement, pour être rigoureux, on devrait écrire "<br />".


Heu non ! En html 5 on s'en fout royal. Par contre en xhtml (surtout en strict), ce n'est pas la même chose (c'est une faute de syntaxe). Je t'avoue que j'ai tendance à le faire mais en fait on s'en fout.

<br>

bazooka07 a écrit :

les expressions régulières sont gourmandes par défaut.
Ton expression va chercher le dernier "</div>" dans le document, pas le prochain.
Il n'y a aucun besoin d'échapper les caractères "<" et ">".

Quand j'ai écrit la RegEx, j'étais en train de faire autre chose. J'ai écrit ça machinalement sans tester. Je sais que les RegEx prennent de la ressource. Après faut pas déconner, si le besoin se fait sentir, on l'utilise. Perso, je réfléchit 30 secondes et si je trouve pas de solution annexe, c'est RegEx (tu comprendras ça quand tu te taperas des charrettes et qu'il est 3-4h du mat Smiley cligne )

Pour l'échappé, en fait je sais pas ce qui m'arrive en ce moment, je confonds avec les assertions avec flags et là pour le coup, le chevron (si c'est un flag avec chevron) est échappé. Or, je le sais pertinemment que c'est pas la peine d'échapper des chevrons.
Modifié par niuxe (26 Jul 2018 - 02:38)
Bonjour, merci à tous pour vos réponses. J'ai retenu la solution proposée par @danielhagnoul qui fonctionne parfaitement.