php - 具有固定标记的 PHP 正则表达式 html 数据属性
问题描述
我有以下固定模式标记场景
<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,但您说您正在优化速度并且标记的结构是可预测的。
- 您只需要对这些点使用惰性量词,并对可选空格多加注意
代码:(演示)
$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',
),
)
您可以通过不使用惰性量词来提高正则表达式的效率。如果您知道属性值不会包含双引号,那么您可以使用带有贪心量词的 this 否定字符类:[^"]*
。
推荐阅读
- vue.js - 如何重构 Vue.js 中的重复属性
- python - 是否有其他开源库用于在 Python 中读取二维码
- android - 将背景颜色黑色设置为仅字符和两个字符之间的白色 TextView
- clang - 使用 Clang 将变量定义作为字符串获取
- python - pandas.DataFrame.describe() 在 .py 脚本中没有输出
- javascript - 如何在发送之前清空ajax数据?
- ios - UITabBar 图标未正确显示
- ios - SKStoreReviewController requestReview 方法需要时间来显示并且应用程序卡住,直到出现 ReviewController
- angular - 以角度在特定行上应用样式
- docker - 在 docker 构建时启用 ssh