如何在HTML中将<li>标签替换为另一个标签并将其值放入新标签中。

huangapple go评论82阅读模式
英文:

How to replace <li> tag in HTML with another tag and place it value in the new tag

问题

Sure, here is the translated HTML code with the &lt;li&gt; elements wrapped as requested:

&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;one&lt;/li-text&gt;&lt;/li&gt;&lt;li&gt;&lt;li-text&gt;two&lt;/li-text&gt;&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;three&lt;/li-text&gt;&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;four&lt;/li-text&gt;&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;five&lt;/li-text&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

I've wrapped each &lt;li&gt; element with &lt;li-text&gt;{li value}&lt;/li-text&gt; as you requested.

英文:

I need to update the following HTML to wrap each &lt;li&gt; with &lt;li&gt;&lt;li-text&gt;{li value}&lt;/li-text&gt;

&lt;ul&gt;&lt;li&gt;one&lt;/li&gt;&lt;li&gt;two&lt;ul&gt;&lt;li&gt;three&lt;ul&gt;&lt;li&gt;four&lt;ul&gt;&lt;li&gt;five&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

hints: I ONLY USING JS, NO JQUERY

I'm trying this, but it's not working as expected!

var html = `&lt;ul&gt;&lt;li&gt;one&lt;/li&gt;&lt;li&gt;two&lt;ul&gt;&lt;li&gt;three&lt;ul&gt;&lt;li&gt;four&lt;ul&gt;&lt;li&gt;five&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;`.replace(/&lt;li[^&gt;]*&gt;/g,&#39;&lt;li&gt;&lt;li-text&gt;$&amp;&lt;/li-text&gt;&#39;)

The result I'm getting is not correct! the value of list should be between &lt;li-text&gt;&lt;/li-text&gt; tags!

&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;&lt;li&gt;&lt;/li-text&gt;one&lt;/li&gt;&lt;li&gt;&lt;li-text&gt;&lt;li&gt;&lt;/li-text&gt;two&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;&lt;li&gt;&lt;/li-text&gt;three&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;&lt;li&gt;&lt;/li-text&gt;four&lt;ul&gt;&lt;li&gt;&lt;li-text&gt;&lt;li&gt;&lt;/li-text&gt;five&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;

答案1

得分: 1

忘记自己解析HTML吧。您可以使用浏览器内置的解析器,选择您的li元素,并替换要包装在li-text中的内容。

const input = `<ul><li>one</li><li>two<ul><li>three<ul><li>four<ul><li>five</li></ul></li></ul></li></ul></li></ul>`
const parser = new DOMParser()
const doc = parser.parseFromString(input, "text/html")
doc.querySelectorAll("li").forEach(li => li.innerHTML = `<li-text>${li.innerHTML}</li-text>`)
const output = doc.body.innerHTML
console.log(output)
英文:

Forget about parsing HTML yourself. You can use the browser's built-in parser, select your li elements, and replace the content to be wrapped with li-text.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

const input = `&lt;ul&gt;&lt;li&gt;one&lt;/li&gt;&lt;li&gt;two&lt;ul&gt;&lt;li&gt;three&lt;ul&gt;&lt;li&gt;four&lt;ul&gt;&lt;li&gt;five&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;`

const parser = new DOMParser()
const doc = parser.parseFromString(input, &quot;text/html&quot;)
doc.querySelectorAll(&quot;li&quot;).forEach(li =&gt; li.innerHTML = `&lt;li-text&gt;${li.innerHTML}&lt;/li-text&gt;`)

const output = doc.body.innerHTML
console.log(output)

<!-- end snippet -->

答案2

得分: 1

解析内容为HTML,选择所有<li>元素,然后用包装器替换每个直接子级文本节点:

function addWrapperToLi(html) {
  const parser = new DOMParser();
  const parsed = parser.parseFromString(html, 'text/html');

  const textNodes = [...parsed.querySelectorAll('li')].flatMap(
    // .childNodes 包含各种节点,包括元素
    element => [...element.childNodes].filter(
      // ...但我们只想要文本节点。
      node => node.nodeType === Node.TEXT_NODE
    )
  );

  textNodes.forEach(node => {
    const wrapper = document.createElement('li-text');
    wrapper.innerText = node.textContent;
    node.parentElement.replaceChild(wrapper, node);
  });

  return parsed.body.innerHTML;
}

尝试它:

<!-- begin snippet: js hide: true -->

<!-- language: lang-js -->

console.config({ maximize: true });

function addWrapperToLi(html) {
  const parser = new DOMParser();
  const parsed = parser.parseFromString(html, 'text/html');

  const textNodes = [...parsed.querySelectorAll('li')].flatMap(
    element => [...element.childNodes].filter(
      node => node.nodeType === Node.TEXT_NODE
    )
  );

  textNodes.forEach(node => {
    const wrapper = document.createElement('li-text');
    wrapper.innerText = node.textContent;
    node.parentElement.replaceChild(wrapper, node);
  });

  return parsed.body.innerHTML;
}

const testcases = [
  '<ul><li>one</li><li>two<ul><li>three<ul><li>four<ul><li>five</li></ul></li></ul></li></ul></li></ul></li></ul>',
  '<ul><li>one</li><li>two<ul><li>three<ul><li>four<ul><li>five</li></ul>after four</li></ul></li></ul></li></ul>after two</li></ul>'
];

testcases.forEach(
  testcase => console.log(addWrapperToLi(testcase))
);

<!-- language: lang-html -->

<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

<!-- end snippet -->
英文:

Parse the content as HTML, select all &lt;li&gt; elements, then replace each direct-children text node with a wrapper:

function addWrapperToLi(html) {
  const parser = new DOMParser();
  const parsed = parser.parseFromString(html, &#39;text/html&#39;);

  const textNodes = [...parsed.querySelectorAll(&#39;li&#39;)].flatMap(
    // .childNodes contains all kinds of nodes, including elements
    element =&gt; [...element.childNodes].filter(
      // ...but we only want text nodes.
      node =&gt; node.nodeType === Node.TEXT_NODE
    )
  );

  textNodes.forEach(node =&gt; {
    const wrapper = document.createElement(&#39;li-text&#39;);
    wrapper.innerText = node.textContent;
    node.parentElement.replaceChild(wrapper, node);
  });

  return parsed.body.innerHTML;
}

Try it:

<!-- begin snippet: js hide: true -->

<!-- language: lang-js -->

console.config({ maximize: true });

function addWrapperToLi(html) {
  const parser = new DOMParser();
  const parsed = parser.parseFromString(html, &#39;text/html&#39;);

  const textNodes = [...parsed.querySelectorAll(&#39;li&#39;)].flatMap(
    element =&gt; [...element.childNodes].filter(
      node =&gt; node.nodeType === Node.TEXT_NODE
    )
  );

  textNodes.forEach(node =&gt; {
    const wrapper = document.createElement(&#39;li-text&#39;);
    wrapper.innerText = node.textContent;
    node.parentElement.replaceChild(wrapper, node);
  });

  return parsed.body.innerHTML;
}

const testcases = [
  &#39;&lt;ul&gt;&lt;li&gt;one&lt;/li&gt;&lt;li&gt;two&lt;ul&gt;&lt;li&gt;three&lt;ul&gt;&lt;li&gt;four&lt;ul&gt;&lt;li&gt;five&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&#39;,
  &#39;&lt;ul&gt;&lt;li&gt;one&lt;/li&gt;&lt;li&gt;two&lt;ul&gt;&lt;li&gt;three&lt;ul&gt;&lt;li&gt;four&lt;ul&gt;&lt;li&gt;five&lt;/li&gt;&lt;/ul&gt;after four&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;after two&lt;/li&gt;&lt;/ul&gt;&#39;
];

testcases.forEach(
  testcase =&gt; console.log(addWrapperToLi(testcase))
);

<!-- language: lang-html -->

&lt;script src=&quot;https://gh-canon.github.io/stack-snippet-console/console.min.js&quot;&gt;&lt;/script&gt;

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年6月13日 08:03:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/76460952.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定