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

Expression régulière JavaScript pour conserver le contenu contenant des mots spécifiques et remplacer tout le reste

Je suppose que c'est simple, mais j'ai du mal avec ce qui suit :

String (HTML passé sous forme de texte) :

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

Maintenant, je dois convertir chacun text<br> 替换为 <div>text</div> A moins que le texte soit à l'intérieur <li>/<ul>.

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

Cela fonctionne bien, mais comment puis-je empêcher <ul><li>text</li></ul><br> d'être remplacé ?

P粉463824410P粉463824410187 Il y a quelques jours396

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

  • P粉488464731

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

    "Vous ne pouvez pas analyser [HTML] à l'aide d'expressions régulières. [...] Avez-vous essayé d'utiliser un analyseur pour [HT]ML à la place ? "

    (Une version plus concise peut être trouvée dans l'extrait de code ci-dessous)

    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; }

    Essayez-le :

    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

    répondre
    0
  • P粉336536706

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

    C'est ma tentative avant d'opter pour une solution regex (plus courte) :

    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);

    répondre
    0
  • Annulerrépondre