正则表达式替换mailto:hrefs但忽略站点链接

jma*_*sen 1 php regex

我需要一些帮助来调整这个正则表达式:

$content = 'more <a href="http://www.test.com">test</a> test <a href="mailto:jeff@test.com">Jeff</a> this is a <a href="http://www.test.com">test</a>';

$content = preg_replace("~<a .*?href=[\'|\"]mailto:(.*?)[\'|\"].*?>.*?</a>~", "$1", $content); 
Run Code Online (Sandbox Code Playgroud)

这个表达式是从一个mailto链接剥离html标记,然后只返回电子邮件(jeff@test.com)

它工作得很好,除了我上面给出的例子 - 因为在模式中的href之前允许无限数量的空格,当网站链接在mailto链接之前时,正则表达式一直向前看,直到找到mailto:在以下链接中删除其间的所有内容.

也许修复只是将它限制在开始标记之后的两个或三个空格,以便看起来不那么遥远,但我想知道是否有更好的解决方案来自那些比我更了解正则表达式的人?

ale*_*lex 6

这是你应该使用的......

$dom = new DOMDocument;

$dom->loadHTML($content);

foreach($dom->getElementsByTagName('a') as $a) {
    if ($a->hasAttribute('href') 
        AND strpos($href = trim($a->getAttribute('href')), 'mailto:') === 0) {

         $textNode = $dom->createTextNode(substr($href, 7));
         $parent = $a->parentNode;
         $parent->insertBefore($textNode, $a);
         $parent->removeChild($a); 

    }   
}
Run Code Online (Sandbox Code Playgroud)

CodePad.

$dom->saveHTML()添加了所有HTML样板文件htmlbody元素,你可以用...删除它们

$html = '';
foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $node) {
    $html .= $dom->saveHTML($node);
}
Run Code Online (Sandbox Code Playgroud)

CodePad.