2017-04-05 88 views
-1

比方说,有两个默认的HTML电子邮件标签:正则表达式,以确保电子邮件地址

<a href="mailto:[email protected]">[email protected]</a> 
<a href="mailto:[email protected]" nosecure>[email protected]</a> 

我只想要查找的电子邮件标记没有nosecure标签在PHP。所以像\<a\b(?![^>]*\bnosecure\b)[^>]*>[^<]*<\/a>这样的东西到目前为止将做到这一点。
但是现在我想为href标记的值和用于<a>...</a>标记内的文本的值组设置一个组。第二组很容易:

\<a\b(?![^>]*\bnosecure\b)[^>]*>([^<]*)<\/a> 

但是,如何获得第一组?在href标记之前/之前可以有无限制的其他字符,而且nosecure可以在href标记之前/之前。
如何获取href="mailto:<group>"的值的正则表达式组。此外,可以有'而不是"

测试用例和我目前的尝试:https://regex101.com/r/RNEZO3/2

感谢所有帮助:)
问候

+1

关于用正则表达式解析XML/HTML的困难的另一个问题......呃。 –

回答

1

Never使用正则表达式解析HTML。始终使用a DOM parser!这比你想象的容易,只需要学习一点XPath到find the attribute(或缺乏)和文本内容。

<?php 
$html = <<< HTML 
<div> 
<a href="mailto:[email protected]">[email protected]</a> 
<a href="mailto:[email protected]" nosecure>[email protected]</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; 
} 
+0

好吧,从来没有听说过这个,但非常感谢,我会看看它,并尝试学习它。但是有一个问题刚刚开始:外部处理似乎是可能的,但是我可以直接用'str_replace'在原始字符串中操作结果吗?所以我在你的例子的最后得到了一个改变的'$ html'而不是独立的输出? – christopher2007

+1

是的,你可以。您可以编辑'$ node'的内容,然后在完成后使用'$ dom-> saveHTML()'输出新文档。 – miken32

+0

要编辑'$ node'是属性时,使用'$ node-> value',当它是文本节点时,使用'$ node-> textContent'。 – miken32

相关问题