用于保护电子邮件地址的正则表达式



假设有两个默认的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;
}

最新更新