Je veux supprimer des balises vides telles que étiquette> code>,
font> font> code> de sorte que:
str=str.replace(/<[\S]+><\/[\S]+>/gim, "");
11 Réponses :
Regex n'est pas pour HTML. Si vous êtes en JavaScript de toute façon, je serais encouragé à utiliser JQuery Dom Traitement.
Quelque chose comme: p> Alternativement: p>
J'ai d'autres nettoyages de regex dans la même fonction. Je préfère cela malheureusement. Le contenu est dans un iframe où l'utilisateur colle de Word Doc. Je nettoie tous les junks msft
Je vais regarder dans l'option JQuery.
Je suis d'accord que Regex semble i> plus facile, mais si vous êtes déjà en JavaScript, JQuery est tellement plus facile et le rend tellement plus facile à étendre les capacités (que si les exigences vous demandent de commencer à supprimer imbriquées
Tags ou tags imbriqués plus de 3 niveaux de profondeur?)
J'utilise JQuery. Je n'ai pas fait ce type de nettoyage avant d'utiliser JQuery. Tout exemple simple aidera .. merci
L'exemple fourni ne fonctionne pas? Faites-moi savoir quel genre d'exemple vous avez besoin et je suis heureux d'aider.
Je sais que le formatage ne fonctionnera pas dans un commentaire, mais copiez-la et collez cela à la tête de votre document:
API.JQUERY.COM/CATEGORY/SLLectors , api.jquery.com/category/travering et api.jquery.com/category/manipulation sont assez utiles, mais laissez-moi savoir ce dont vous avez besoin en particulier.
Merci graphain. Le HTML ci-dessus est le stocké dans une chaîne variable JS. Je fais regex sur cette variable. J'ai déjà eu un autre ensemble de regex à faire à l'autre nettoyage. Je peux laisser tomber ce HTML à l'intérieur d'un div et un processus en utilisant jQuery?
@Graphain merci. J'espère que cela aidera Bobby à démarrer. Votre code a fonctionné bien.
@Bobby: Yep, à peu près sûr que vous pouvez aller $ (données). ('*: Vide'), où les données sont votre chaîne var. Laissez-moi savoir si cela fonctionne.
P.s. Pour une référence future, à l'heure de ce flux de commentaires graphain code> était mon nom d'utilisateur.
Cela donnera false code> ->
$ ('
Vous avez besoin de Éviter complètement les expressions régulières, car l'autre réponse recommande, c'est aussi une excellente idée, mais je voulais souligner l'importante distinction gourmande vs non gourmande, qui vous servira bien dans une grande variété de situations où les regexnes sont em> garantis. P> / <[\ s] +?> <\ / [\ S] +?> / code> - la différence est le
? code> s après le < code> + code> s, pour correspondre "aussi peu que possible" (AKA "Match non gourmand") caractères nonspace (bien que 1 ou plus), au lieu du
+ code> S "Autant que possible" (aka "match gourmand"). P>
Vous avez des "espaces" comme classe de caractères, ce qui signifie " Modifiez ceci: p> à ceci: italique i> p> code>" correspondra. La première moitié de votre regex correspondra "
italique i)> code>" et la seconde moitié "
(p)> code>". (J'ai utilisé des supports pour montrer ce que chaque
[\ s] + code> correspondance.)
/<[^/>][^>]*><\/[^>]+>/
C'est l'expression la plus proche. D'autres ne fonctionnent pas. Mais celui-ci supprime i> p> aussi. Je joue avec le code. Merci
@Andreasjohanansson: Cela ne fera pas vraiment une différence à moins que vous n'ayez pas analysé très i> HTML.
Tout cela échoue dans le cas de quelque chose comme "
blockQuote "rel =" Nofollow Noreferrer "> Instagram.com/ "> blockquote a >>". Donc, je préfère cette regex: <([^ \ />] + | [^ \ />] * [^ "\ '>] * [" \ '] [^ \ />] +)> \ s * <\ / [^>] +>
C'est un problème de la regex gourmand. Essayez ceci: p>
ou p>
dans votre regex, str = str.replace (/ <[\ ^>] +> <\ / [\ s] +> / gim, ""); P> P>
str = str.replace (/ <[\ s] +?> <\ / [\ S] +> / gim, ""); p> p>
<[\ s] +?> code> correspondent
italique i> code> et le
<\ / [ +> code> correspond au
p> code> p>
Je vois ce qui manque..Merci
J'aime la solution de jQuery de Mattmitchell, mais voici une autre option à l'aide de JavaScript natif.
function CleanChildren(elem) { var children = elem.childNodes; var len = elem.childNodes.length; for (var i = 0; i < len; i++) { var child = children[i]; if(child.hasChildNodes()) CleanChildren(child); else elem.removeChildNode(child); } }
Toutes les réponses avec regex ne valident que mais dans le cas de p> essayez ce modèle pour obtenir tout ce qui précède p>
C'est aussi en tenant compte si j'ai 'UL' suivi de "LI". Comment puis-je sauter ça?
Je suggère de remplacer [\ n \ r \ t] * code> avec
[\ s] * code> qui signifierait la même chose plus un couple plus (\ f et \ v) et espace aussi ..
Vous pouvez utiliser celui-ci
texte = texte.replace (/ <[^ />] [^>] > \ s em> [^>] +> / gim, ""); code> < / p>
Voici une solution javascript indigène moderne; qui est effectivement assez similaire à la JQuery One d'ici 2010. Je l'ai adapté de cette réponse à un projet sur lequel je travaille et que je pensais le partageriez ici.
document.querySelectorAll("*").forEach((x)=>{ let tagName = "</" + x.tagName + ">"; if (x.outerHTML.slice(tagName.length).toUpperCase() == tagName && /[^\s]/.test(x.innerHTML)) { x.remove(); } });
Ceci sélectionnera n'importe quel élément vide dans le document em> em>, si vous ne vouliez que supprimer des éléments vides de l'intérieur d'une certaine partie de la page (c'est-à-dire que seuls ceux de certains C'est presque certainement ce que vous voulez. strong> techniquement quelques étiquettes importantes (par exemple, Espérons que cela aide quelqu'un. C'est incroyable de voir jusqu'où JavaScript est venu en seulement 8 ans; de presque toujours avoir besoin d'une bibliothèque pour écrire quelque chose de complexe comme celui-ci de manière concise de pouvoir le faire de manière native. P> Donc, la méthode détaillée ci-dessus fonctionnera bien dans la plupart des circonstances, mais il a deux questions: p> J'ai écrit une fonction légèrement plus grande qui traite de ces deux cas d'utilisation: p> Nous parcourons chaque élément de la page. Nous saisissons le nom de la balise de cet élément (par exemple, si l'élément est un divisé, cela serait Cette étiquette est de 6 caractères. Nous vérifions si les 6 caractères supérieurs de 6 caractères des éléments HTML correspondent à ce que nous continuons. Si ce n'est pas le cas, l'élément n'a pas de Étiquette de fermeture, et doit donc être auto-fermeture. Ceci est préférable sur une liste, car cela signifie que vous ne devez rien mettre à jour si une nouvelle étiquette d'auto-fermeture est ajoutée à la spécification. P> Alors , nous vérifions si le contenu de l'élément contient n'importe quel espace blanche. document.queryselectorallall code> retourne un
NODELIST code>; qui est essentiellement un tableau de tous les nœuds DOM correspondant au sélecteur CSS qui lui est donné comme argument. P>
*: vide code> est un sélecteur qui sélectionne tous les éléments (
* code> signifie "n'importe quel élément") qui est vide (ce qui est ce que
: vide code> signifie). p>
div code> élément); Vous pouvez ajouter un identifiant à cet élément, puis utiliser le sélecteur
#Id *: vide code>, ce qui signifie n'importe quel élément vide dans l'élément avec un identifiant de
ID p >
CODE> Tags,
code> Etiquettes,
code> tags, etc.) sont "vides"; Donc, sans spécifier une portée, vous finirez par supprimer des tags que vous vous souciez probablement de. p> li>
ul> li>
foreach code> à chaque élément de la nodéliste
résultante code> et exécute la fonction anonyme
(x) => {x.remove ()} code> dessus.
x code> est l'élément actuel de la liste et appelant
.ReMove () code> sur elle supprime cet élément de la DOM. P> LI>
ul>
Edit h1>
: vide code> (pas l'espace entre les deux). CSS NIVEAU 4 SÉLECTEURS RÉALISER Ceci avec l'introduction du sélecteur
: vide code> (qui est comme vide, sauf qu'il ignore la touche blanche), mais seulement Firefox supporte-la (sous forme préfixée par le fournisseur). LI>
: vide code> - et cela restera le cas avec
: vide code> aussi. li>
ul>
div code> et l'utiliser pour construire une étiquette de fermeture - par exemple
div> div>. p>
/ [^ \ s] / code> est une regex.
[] code> est un ensemble dans REGEX et correspondra à tout Caractère qui apparaît à l'intérieur. Si
^ code> est le premier élément, le jeu devient annulé em> - il correspondra à tout élément qui n'est pas dans l'ensemble.
\ s signifie blancheur - onglets, espaces, pauses de ligne. Alors qu'est-ce que
[^ \ s] code> dit est "n'importe quel caractère qui n'est pas d'espace blanc". P> correspondant à cela, si la balise ne se ferme pas auto-fermeture et que son contenu contient un caractère non-blancs, puis nous le supprimons. P> Bien sûr, c'est un peu plus grand et moins élégant que la précédente doublure. Mais cela devrait fonctionner pour essentiellement chaque cas. P> p>
J'ai découvert que ce code élimine effectivement les étiquettes non extérieures nécessaires comme Link and Meta. C'est en fait une belle "doublure" mais c'est un peu rugueuse sur le HTML. Essayer de trouver un ajustement qui le corrige. Plus un pour la simplicité définitivement.
@ LE-NERDTM J'ai ajouté une modification à mon message, qui devrait résoudre ces problèmes.
trouvé ceci sur le code de code:
JQuery Bien que le travail vous devrez modifier l'élément pour indiquer où vous souhaitez supprimer les balises vides. NE POINT PAS POINT AU DOCUMENT CAISE CELA RÉDURE DANS MON RÉPONSE À TOASTACKERNIGMA P> P>
Supprimer les étiquettes vides avec cheerio va et supprimera aussi des images: Supprimez les étiquettes vides avec cheerio, mais gardez également des images: p> $('*')
.filter(function(index, el) {
return (
el.tagName !== 'img' &&
$(el).find(`img`).length === 0 &&
$(el)
.text()
.trim().length === 0
)
})
.remove()
<div>asdf</div> <div></div> -- will match only this <div></notdiv> -- and this <div > </div >
Je pense que le balisage de la pile sur le débordement peut jouer avec vous. Le résultat de votre routine avant et après votre nettoyage nous ressemble.
Les deux lignes apparaissent la même. Pouvez-vous utiliser le bloc de code afin que le texte ne soit pas formaté?
Correction du balisage, de la Bods, espère que cela a plus de sens.
Ce forum est si rapide? Je ne peux pas croire que vous êtes si rapide !!