【问题标题】:Find all the HTML tags via regex (except br and li tags) [duplicate]通过正则表达式查找所有 HTML 标签(br 和 li 标签除外)[重复]
【发布时间】:2021-02-16 19:50:33
【问题描述】:

我在Javascript 代码中遇到了一个与正则表达式相关的问题。我正在寻找一个可以匹配除br 标签和li(包括olul)之外的所有HTMl 标签的正则表达式。

到目前为止,我拥有可以检测除 br 标签之外的 HTML 标签的正则表达式。如下

(<((?!br)[^>]+(.*?)?)>)

&lt;li&gt;&lt;ol&gt;&lt;ul&gt;tags 方面需要帮助。 (包括结束标签)

这是用于检查的示例文本。

<ol>
  <li>hi</li>
</ol>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

hello <br /> world <br /> :)

'https://www.youtube.com'

 Normal text: should not match!!

'https://www.hotmail.com'

<img src="https://4.img-dpreview.com/files/p/E~TS590x0~articles/3925134721/0266554465.jpeg" />

<img src="/" />

我正在使用https://regexr.com/ 来测试正则表达式。

提前谢谢你!!

【问题讨论】:

  • Regex 不是解决此问题的正确工具。为什么不使用 HTML 解析器?
  • Regex 是 notoriously 不适合这项工作的工具。 (例如,如果有任何父标签包含您要保留的内容,您现有的正则表达式将失败。)。 HTML 是复杂的结构化数据,最好使用专为处理它而设计的 DOM 工具,而不是通过字符串解析器强制它。

标签: javascript html regex


【解决方案1】:

有句老话,如果你想用正则表达式解决你的问题,你最终会遇到两个问题。虽然公认的强大工具,但在这种情况下,Regex 只能作为最后的手段使用。

试试下面的:

const getAllNodesExceptBrAndLi = htmlString => {
  const template = document.createElement('template');
  template.innerHTML = htmlString;
  const allNodes = template.content.querySelectorAll('*');

  return [...allNodes].filter(node => node.tagName !== 'BR' && node.tagName !== 'LI');
};

【讨论】:

    【解决方案2】:
    /(<((?!br)(?!ol)(?!\/ol)(?!ul)(?!\/ul)(?!li)(?!\/li)[^>]+(.*?)?)>)/ig
    

    【讨论】:

    • 一旦将 html 属性添加到组合中,这将失败。如果您关心健壮的代码,Przemek 提出的解决方案是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2023-03-10
    • 2016-08-15
    • 2018-04-30
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多