【问题标题】:PHP regex matching <html> tag with optional attributesPHP 正则表达式匹配具有可选属性的 <html> 标记
【发布时间】:2015-03-15 18:50:41
【问题描述】:

我正在尝试将&lt;html&gt; 标记与可选属性匹配并提取这些属性。我想匹配&lt;html&gt; 标签的以下变体之一。它可能是 HTML 文档的起始内容,或者在 &lt;html&gt; 之前可能有 DOCTYPE 声明。

<html>
<html lang="en">
<html class="my-class">
<html class="my-class" lang="en">

我正在尝试的正则表达式模式如下,但它只匹配第四种情况的最后一个属性lang="en"

/<html(\s+([a-z\-]+)=('|")([^"'>]*)('|"))*>/i

Demo

我知道有些人建议使用 DOM 解析器而不是正则表达式。但我认为正则表达式足以满足我的情况,因为我只想匹配 &lt;html&gt; 标签。

【问题讨论】:

  • &lt;html 总是出现在第一位吗?
  • @AvinashRaj 没问题。我们可以在模式的开头添加^
  • 我的意思是&lt;html之前有空格吗?

标签: php html regex


【解决方案1】:

使用下面的正则表达式,然后从组索引 1 和 3 中获取属性值对。

(?:<html|(?<!^)\G)\h*(?:([^=\n\h]+)=(['"])((?:\\\2|(?!\2).)*)\2)?

\G reference.

DEMO

【讨论】:

  • 谢谢。但我也想匹配没有属性的&lt;html&gt;(第一种情况)。我想特别操作属性classlang 的值,并保持其他属性不变。如果有class,我想追加它的值,如果没有class,我想添加class
  • 先生,如何成为像您这样的正则表达式大师,请多多指教。 @AvinashRaj
  • @AvinashRaj 太棒了!赞成。最好将属性名称和属性值分开提取,这样可以在不使用字符串操作的情况下轻松对结果进行进一步处理。
  • @BeingHuman 就是这么简单。几个月前(大约 10 个月)我开始学习正则表达式(80%)。这个网站教我正则表达式。这里的人真的很棒。我从正则表达式大师(来自 SO)那里学到了一些东西。有些人消除了我的疑虑。我想成为一些人中的一个人。是的,您可以通过在我的帖子下方发表评论来问我对正则表达式的任何疑问。
  • @Sithu 从索引 1 获取属性并从 3 获取值 regex101.com/r/kG5vF1/4
猜你喜欢
  • 2019-04-12
  • 2012-02-18
  • 2013-06-16
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多