假设有两个默认的HTML电子邮件标签:
<a href="mailto:test@test.com">test@test.com</a>
<a href="mailto:test@test.com" nosecure>test@test.com</a>
我只想在 PHP 中找到没有nosecure
标签的电子邮件标签。因此,到目前为止,像<ab(?![^>]*bnosecureb)[^>]*>[^<]*</a>
这样的东西就可以解决问题。
但是现在我想用一个组来表示href
标签的值,另一组用于<a>...</a>
标签内的文本。第二组很简单:
<ab(?![^>]*bnosecureb)[^>]*>([^<]*)</a>
但是我如何获得第一组呢?在 href 标签之后/之前可以有无限的其他字符,也可以有 nosecure 在 href 标签之后/之前。
如何获取值为href="mailto:<group>"
的正则表达式组。此外,可以有'
而不是"
。
测试用例和我目前的尝试:https://regex101.com/r/RNEZO3/2
感谢您的任何帮助:)
问候
切勿使用正则表达式来解析 HTML。始终使用 DOM 解析器!这比您想象的要容易,只需学习一些XPath即可找到属性(或缺少属性)和文本内容。
<?php
$html = <<< HTML
<div>
<a href="mailto:test@test.com">test@test.com</a>
<a href="mailto:test@test.com" nosecure>test@test.com</a>
</div>
HTML;
$dom = new DomDocument();
$dom->loadHTML($html);
$xpath = new DomXPath($dom);
/* href attribute */
$result = $xpath->query("//a[not(@nosecure)]/@href");
foreach ($result as $node) {
echo str_replace("mailto:", "", $node->value);
}
/* text content */
$result = $xpath->query("//a[not(@nosecure)]/text()");
foreach ($result as $node) {
echo $node->textContent;
}