PHP 正则表达式 html 具有固定标记的数据属性

PHP regex html data attributes with fixed markup

我有以下固定模式标记场景

<div class="myclass" id="id123" data-foo="bar">content</div>
<div class="myclass" id="id123" data-foo="bar" >content</div>
<div class="myclass" id="id123" data-foo="bar" data-baz="qux">content</div>
<div class="myclass" id="id123" data-foo="bar" data-baz="qux" >content</div>

我正在尝试解析以下值

id123
bar
qux (if it ever exists)

我能够弄清楚如何获得不同的场景,但我很容易想出适用于所有场景的最终规则。

/<div class="myclass" id="(.*)" data-foo="(.*)"(data-baz="(.*)")?>/

我似乎缺少一些基本的正则表达式原则。我尝试了边界和结尾以及空格,但运气不好。

  1. 我不赞成使用正则表达式来解析 html,但你说你正在优化速度并且标记的结构是可预测的。
  2. 您只需要对这些点使用惰性量词,并更加注意可选空格

代码:(Demo)

$text = <<<TEXT
<div class="myclass" id="id123" data-foo="bar">content</div>
<div class="myclass" id="id123" data-foo="bar" >content</div>
<div class="myclass" id="id123" data-foo="bar" data-baz="qux">content</div>
<div class="myclass" id="id123" data-foo="bar" data-baz="qux" >content</div>
TEXT;

preg_match_all('~<div class="myclass" id="(.*?)" data-foo="(.*?)" ?(?:data-baz="(.*?)" ?)?>~', $text, $matches);
var_export(array_slice($matches, 1));

输出:

  0 => 
  array (
    0 => 'id123',
    1 => 'id123',
    2 => 'id123',
    3 => 'id123',
  ),
  1 => 
  array (
    0 => 'bar',
    1 => 'bar',
    2 => 'bar',
    3 => 'bar',
  ),
  2 => 
  array (
    0 => '',
    1 => '',
    2 => 'qux',
    3 => 'qux',
  ),
)

您可以通过不使用惰性量词来提高正则表达式的效率。如果您知道属性值将不包含双引号,那么您可以使用带有贪婪量词的否定字符class:[^"]*.