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="(.*)")?>/
我似乎缺少一些基本的正则表达式原则。我尝试了边界和结尾以及空格,但运气不好。
- 我不赞成使用正则表达式来解析 html,但你说你正在优化速度并且标记的结构是可预测的。
- 您只需要对这些点使用惰性量词,并更加注意可选空格
代码:(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:[^"]*
.
我有以下固定模式标记场景
<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="(.*)")?>/
我似乎缺少一些基本的正则表达式原则。我尝试了边界和结尾以及空格,但运气不好。
- 我不赞成使用正则表达式来解析 html,但你说你正在优化速度并且标记的结构是可预测的。
- 您只需要对这些点使用惰性量词,并更加注意可选空格
代码:(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:[^"]*
.