suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Regulärer Ausdruck zum Entfernen von Leerzeichen zwischen ungültigen HTML-Tags – z. B. „</b>“ sollte „</b>“ sein.

<p>Ich habe HTML, das durch Leerzeichen in Tags durcheinander gebracht wurde, und möchte es wieder gültig machen – zum Beispiel: </p> <pre class="brush:php;toolbar:false;"< div class='test' >1 > Bananen< / div ></pre> <p> sollte in gültiges HTML konvertiert werden und soll beim Rendern Folgendes erzeugen: </p> <p> <pre class="snippet-code-html lang-html Prettyprint-override"><code><div class='test'>1 > 0 ist <b>true</b> >>> Bananen</div></code></pre> </p> <p>Jeder Text, dem in <code>></code> oder <</code> Leerzeichen vorangehen/folgen, sollte unverändert bleiben – zum Beispiel <code> ;1 > 0</code> sollte beibehalten werden, anstatt auf <code>1>0</code></p > komprimiert zu werden. <p>Mir ist klar, dass hierfür möglicherweise mehrere reguläre Ausdrücke erforderlich sind, was in Ordnung ist.</p> <p>Ich habe ein paar Dinge:</p> <p><code><s?/s*</code> Dadurch wird <code></ b></ div ></code> teilweise korrigiert ;/b></div ></code> aber ich arbeite am Rest</p> <p>Zum Beispiel könnte ich einen drastischen Ansatz wählen, aber das würde auch den Code innerhalb des Textteils des Etiketts zerstören, nicht den Etikettennamen selbst</p>
P粉884667022P粉884667022449 Tage vor505

Antworte allen(2)Ich werde antworten

  • P粉323050780

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

    没有合理的方法来保存像您发布的内容一样损坏的文档,但假设您将文本中的 > 和类似字符替换为其相关实体,例如: > ;,您可以将要接受的文档放入适当的库中,例如 DomDocument 将处理剩下的事情。

    $input = <<<_E_
    < div class='test' >1 &gt; 0 is < b >true</ b> and apples &gt;&gt;&gt; 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());
    

    输出:

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

    Antwort
    0
  • P粉064448449

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

    这个正则表达式也有效:

    它将 HTML 标记中的有效部分分为四个部分,并用其替换其余部分(空格)。

    Regex101 演示

    /(<)\s*(\/?)\s*([^<>]*\S)\s*(>)/g

    • (<) - 捕获起始尖括号(第 1 节)
    • \s* - 匹配任何空格
    • (\/?) - 捕获可选的反斜杠(第 2 部分)
    • \s* - 匹配反斜杠后的任何空格
    • ([^<>]*\S) - 捕获标签内的内容,不带尾随空格(第 3 节)
    • \s* - 匹配内容后面和右尖括号之前的空格
    • (>) - 捕获右尖括号(第 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, "$1$2$3$4");
    console.log(newStr);

    Antwort
    0
  • StornierenAntwort