Expression régulière pour supprimer les espaces entre les balises HTML non valides - par exemple, "</b>" doit être "</b>"
P粉884667022
2023-09-02 19:56:28
<p>J'ai du code HTML qui est gâché par des espaces dans les balises et je souhaite le rendre à nouveau valide - par exemple : </p>
<pre class="brush:php;toolbar:false;">< div class='test' >1 > 0 est < b >true</ b> bananes&Lt / div >≪/pre>
<p> doit être converti en HTML valide et, une fois rendu, devrait produire : </p>
<p>
<pre class="snippet-code-html lang-html Prettyprint-override"><code><div class='test'>1 > 0 est <b>true</b> >>> bananes</div></code></pre>
</p>
<p>Tout texte précédé/suivi d'espaces dans <code>></code> ou </code>><</code> doit rester inchangé ; par exemple, <code> ;1 > 0</code> doit être conservé au lieu d'être compressé en <code>1>0</code></p >
<p>Je réalise que cela peut nécessiter plusieurs expressions régulières, ce qui est très bien</p>
<p>J'ai quelques éléments :</p>
<p><code><s?/s*</code> Cela corrigera partiellement <code></ b></ div ></code> ;/b></div ></code> mais je travaille sur le reste<
<p>Par exemple, je pourrais adopter une approche drastique, mais cela briserait également le code dans la partie texte de l'étiquette, et non le nom de l'étiquette lui-même</p>
Il n'existe aucun moyen raisonnable de sauvegarder un document aussi corrompu que celui que vous avez publié, mais en supposant que vous mettiez
>
和类似字符替换为其相关实体,例如:> ;
dans le texte, vous pouvez mettre le document que vous souhaitez accepter dans une bibliothèque appropriée telle que DomDocument qui se chargera de le repos.Sortie :
Cette regex fonctionne également :
Il divise la partie valide de la balise HTML en quatre parties et remplace les parties restantes (espaces) par celles-ci.
Démo Regex101
/(]*S)s*(>)/g
( - Capture équerre d'ouverture (section 1)
s*
- s'adapte à n'importe quel espace(/?)
- Capture des barres obliques inverses facultatives (Partie 2)s*
- correspond à n'importe quel espace après une barre oblique inverse([^]*S)
- Capturez le contenu dans les balises sans espaces de fin (section 3)s*
- Correspond aux espaces après le contenu et avant le crochet droit(>)
- Capturer l'équerre droite (section 4)