Rumah  >  Soal Jawab  >  teks badan

Ungkapan biasa JavaScript untuk mengekalkan kandungan yang mengandungi perkataan tertentu dan menggantikan semua yang lain

Saya rasa ini mudah, tetapi saya bergelut dengan perkara berikut:

String (HTML diluluskan sebagai teks):

text<br>text<br><ul><li>text</li></ul><br>

Sekarang saya perlu menukar setiap satu text<br> 替换为 <div>text</div> Melainkan teks ada di dalam <li>/<ul>.

.replace(/(.*?)<br>/g, '<div></div>')

Ini berfungsi dengan baik, tetapi bagaimana cara saya menghalang <ul><li>text</li></ul><br> daripada diganti?

P粉463824410P粉463824410187 hari yang lalu399

membalas semua(2)saya akan balas

  • P粉488464731

    P粉4884647312024-04-02 10:29:52

    "Anda tidak boleh menghuraikan [HTML] menggunakan ungkapan biasa. [...] Adakah anda cuba menggunakan penghurai untuk [HT]ML sebaliknya? "

    (Versi yang lebih ringkas boleh didapati dalam coretan kod di bawah)

    function replaceTextBrWithDiv(html) {
      // Create an element that acts as a parser
      const parser = document.createElement('div');
      parser.innerHTML = html;
    
      // Modify an array-like when iterating over it may cause some issues.
      // Copy it first.
      const childNodes = [...parser.childNodes];
    
      // Index-based iterating
      for (let index = 0; index < childNodes.length; index++) {
        const node = childNodes[index];
        const nextNode = childNodes[index + 1];
    
        if (node instanceof Text && nextNode instanceof HTMLBRElement) {
          const div = document.createElement('div');
    
          // Remove text node from parser and append it to div
          div.appendChild(node);
          nextNode.replaceWith(div);
    
          // Skip next node (i.e. 
    ) index++; } } return parser.innerHTML; }

    Cubalah:

    console.config({ maximize: true });
    
    function replaceTextBrWithDiv(html) {
      const parser = document.createElement('div');
      parser.innerHTML = html;
    
      parser.childNodes.forEach((node, index, nodes) => {
        const nextNode = nodes[index + 1];
        
        if (node instanceof Text && nextNode instanceof HTMLBRElement) {
          const div = document.createElement('div');
          div.appendChild(node);
          nextNode.replaceWith(div);
        }
      });
      
      return parser.innerHTML;
    }
    
    const content = 'text
    text
    • text

    '; console.log(replaceTextBrWithDiv(content));
    sssccc

    balas
    0
  • P粉336536706

    P粉3365367062024-04-02 09:47:45

    Ini adalah percubaan saya sebelum menggunakan penyelesaian regex (lebih pendek):

    const dFrag = document.createDocumentFragment();
    str.textContent.split('
    ').forEach(substr => { const div = document.createElement('div'); let ul; if (!substr) { substr = '
    '; } div.innerHTML = substr; ul = div.querySelector('ul'); if (ul) { dFrag.appendChild(ul); } else { dFrag.appendChild(div); } }); str.innerHTML = ''; str.appendChild(dFrag);

    balas
    0
  • Batalbalas