用于识别HTML标记的Regx已启动但未关闭

时间:2019-05-14 10:14:40

标签: javascript node.js regex

我有必须确定2点的要求。

  1. 替换所有具有封闭标签但没有多余<a></a>, <p></p>, <i></i>标签的标签。 为此,我做了很多研发工作,但找不到确切的解决方案。 我最后找到的regx:(?!<p|a|i|>)(?<opentag><(?!/)[^>]*[^/]>)

但这也正在查找没有像<abc>这样的结束标签的标签

注意::在此我要用空格替换开始和结束标签。

  1. 如果我们有没有结束标签的标签,那么我只想删除特殊符号而不是整个标签。 <abc>应该是abc

示例:

输入字符串:

   <br />
   <ul id="matchMe" type="square">
      <li>stuff...</li>
      <li>more stuff</li>
      <li>
          <div>
               <span>still more</span>
               <ul>
                    <li>Another &gt;ul&lt;, oh my!</li>
                    <li>...</li>
               </ul>
          </div>
      </li>
   </ul>
<p>....</p>
<p class="hhh">....</p>

<customTag1> Hello <CustomTag2>

输出字符串:

      stuff...
      more stuff


               still more

                    Another &gt;ul&lt;, oh my!
                    ...




<p>....</p>
<p class="hhh">....</p>

customTag1 Hello CustomTag2

在此示例中,我不想对p标签做任何事情,但是所有其他具有自闭标签或闭标签的标签都应替换为空白。 customTag1CustomTag2都是自定义标签,看起来像HTML的开始标签,但没有结束标签。对于这些标签,我只希望仅删除<,>符号。

很少有人回答,但没有完全解决 https://stackoverflow.com/a/7564061/4813631 https://stackoverflow.com/a/10267932/4813631

谢谢

1 个答案:

答案 0 :(得分:0)

它应该起作用:

let html = `<br />
<ul id="matchMe" type="square">
   <li>stuff...</li>
   <li>more stuff</li>
   <li>
       <div>
            <span>still more</span>
            <ul>
                 <li>Another &gt;ul&lt;, oh my!</li>
                 <li>...</li>
            </ul>
       </div>
   </li>
</ul>
<p>....</p>
<p class="hhh">....</p>

<customTag1> Hello <CustomTag2>
`
let allInitialsTags = html.match(/<([a-zA-Z\d]*(?=\s)*(?!\/))/g)
allInitialsTags = allInitialsTags.map(el=>el.replace("<",''))
let allEndTags = html.match(/(<\/[a-zA-Z\d]*\s*)/g)
allEndTags = allEndTags.map(el=>el.replace("</",''))
const tagWithNotClosingTag = []
allInitialsTags.forEach(el=>{
     if(!allEndTags.includes(el)){
          tagWithNotClosingTag.push(el)
     }
})
tagWithNotClosingTag.forEach(el=> {
     html = html.replace(RegExp(`<${el}>`,'g'),`${el}`)
})

const result = html.replace(/<[^(p|a|i)]?[^(\/p|\/a)?][^>]*>/g,"")
console.log(result)