查找 html div class 内容和数据属性的正则表达式? (preg_match_all)
Regex to find html div class content and data-attr? (preg_match_all)
使用 preg_match_all 我想在 html 中获取 class 和数据属性。
下面的例子有效,但是它只returnsclass命名或者 仅 data-id 内容。
我希望示例模式同时查找 class 和 data-id 内容。
我应该使用哪种正则表达式模式?
Html内容:
<!-- I want to: $matches[1] == test_class | $matches[2] == null -->
<div class="test_class">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div class="test_class" data-id="1">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div id="test_id" class="test_class" data-id="1">
<!-- I want to: $matches[1] == test_class test_class2 | $matches[2] == 1 -->
<div class="test_class test_class2" id="test_id" data-id="1">
<!-- I want to: $matches[1] == 1 | $matches[2] == test_class test_class2 -->
<div data-id="1" class="test_class test_class2" id="test_id" >
<!-- I want to: $matches[1] == 1 | $matches[2] == test_class test_class2 -->
<div id="test_id" data-id="1" class="test_class test_class2">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div class="test_class" id="test_id" data-id="1">
不能正常工作的正则表达式:
$pattern = '/<(div|i)\s.*(class|data-id)="([^"]+)"[^>]*>/i';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
提前致谢。
为什么不使用 DOM 解析器呢?
您可以使用像 //div[@class or @data-id]
这样的 XPath 表达式来定位元素然后提取它们的属性值
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$divs = $xpath->query('//div[@class or @data-id]');
foreach ($divs as $div) {
$matches = [$div->getAttribute('class'), $div->getAttribute('data-id')];
print_r($matches);
}
我支持 Phil 的回答,我认为 HTML 解析器是可行的方法。它更安全,可以处理很多复杂的事情。
话虽如此,如果您想在您的示例中尝试正则表达式,它将是这样的:
<(?:div|i)(?:.*?(?:class|data-id)="([^"]+)")?(?:.*?(?:class|data-id)="([^"]+)")?[^>]*>
使用 preg_match_all 我想在 html 中获取 class 和数据属性。
下面的例子有效,但是它只returnsclass命名或者 仅 data-id 内容。
我希望示例模式同时查找 class 和 data-id 内容。
我应该使用哪种正则表达式模式?
Html内容:
<!-- I want to: $matches[1] == test_class | $matches[2] == null -->
<div class="test_class">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div class="test_class" data-id="1">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div id="test_id" class="test_class" data-id="1">
<!-- I want to: $matches[1] == test_class test_class2 | $matches[2] == 1 -->
<div class="test_class test_class2" id="test_id" data-id="1">
<!-- I want to: $matches[1] == 1 | $matches[2] == test_class test_class2 -->
<div data-id="1" class="test_class test_class2" id="test_id" >
<!-- I want to: $matches[1] == 1 | $matches[2] == test_class test_class2 -->
<div id="test_id" data-id="1" class="test_class test_class2">
<!-- I want to: $matches[1] == test_class | $matches[2] == 1 -->
<div class="test_class" id="test_id" data-id="1">
不能正常工作的正则表达式:
$pattern = '/<(div|i)\s.*(class|data-id)="([^"]+)"[^>]*>/i';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
提前致谢。
为什么不使用 DOM 解析器呢?
您可以使用像 //div[@class or @data-id]
这样的 XPath 表达式来定位元素然后提取它们的属性值
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$divs = $xpath->query('//div[@class or @data-id]');
foreach ($divs as $div) {
$matches = [$div->getAttribute('class'), $div->getAttribute('data-id')];
print_r($matches);
}
我支持 Phil 的回答,我认为 HTML 解析器是可行的方法。它更安全,可以处理很多复杂的事情。
话虽如此,如果您想在您的示例中尝试正则表达式,它将是这样的:
<(?:div|i)(?:.*?(?:class|data-id)="([^"]+)")?(?:.*?(?:class|data-id)="([^"]+)")?[^>]*>