Maison  >  Questions et réponses  >  le corps du texte

Expression régulière pour supprimer les espaces entre les balises HTML non valides - par exemple, "</b>" doit être "</b>"

<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>
P粉884667022P粉884667022437 Il y a quelques jours487

répondre à tous(2)je répondrai

  • P粉323050780

    P粉3230507802023-09-03 16:42:37

    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.

    $input = <<<_E_
    < div class='test' >1 > 0 is < b >true</ b> and apples >>> bananas< / div >
    _E_;
    
    $input = preg_replace([ '#<\s+#', '#</\s+#' ], [ '<', '</' ], $input);
    
    $d = new DomDocument();
    $d->loadHTML($input, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    
    var_dump($d->saveHTML());
    

    Sortie :

    string(80) "<div class="test">1 > 0 is <b>true</b> and apples >>> bananas</div>"
    

    répondre
    0
  • P粉064448449

    P粉0644484492023-09-03 11:17:47

    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*([^<>]*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)

    const reg = /(<)\s*(\/?)\s*([^<>]*\S)\s*(>)/g
    const str = "< div class='test' >1 > 0 is < b >true< / b > and apples >>> bananas< / div  >"
    const newStr = str.replace(reg, "");
    console.log(newStr);

    répondre
    0
  • Annulerrépondre