【问题标题】:PHP: Detect and correct outgoing links in HTMLPHP:检测并纠正 HTML 中的传出链接
【发布时间】:2018-07-13 13:28:15
【问题描述】:

我需要一个函数来纠正给定 HTML 文本中的所有传出链接,并将属性“rel=nofollow”添加到链接中。只应更正传出链接。

示例:我的域是 www.laptops.com

$myDomain = "www.laptops.com";

$html = 
 "Hello World have a look at <a href="www.laptops.com/apple">Apple Laptops</a>. 
  For more ino go to <a href="www.apple.com">Apple.com</a> 
  or to <a href="www.appleblog.com">Appleblog.com</a>";

function correct($html,$myDomain){ 
    //get all links by filtering '<a ... href="{$link}" .....>' and 
    //check with isOutgoing($href,$myDomain )
}

$newHTML = correct($html,$myDomain);

echo $newHTML;

//Hello World have a look at <a href="www.laptops.com/apple">Apple Laptops</a>. 
//For more ino go to <a rel="nofollow" href="www.apple.com">Apple.com</a> 
//or to <a rel="nofollow" href="www.appleblog.com">Appleblog.com</a> 

到目前为止,我有一个函数“isOutgoing($link)”,它可以检测链接是否传出,但检测所有“ " 部分 HTML 文本和过滤 {$link} 会产生问题。我知道 preg_match() 应该可以,但我不知道如何解决。

【问题讨论】:

  • “我知道 preg_match() 应该可以” ....don't do it ...别想了,他会听到的!
  • 必须是PHP吗?在 jQuery 中非常简单

标签: php html hyperlink autocorrect nofollow


【解决方案1】:

您应该避免使用正则表达式,而应该使用DOMDocumentDOMXPath

<?php
$dom = new DOMDocument();

$dom->loadHtml('
Hello World have a look at <a href="www.laptops.com/apple">Apple Laptops</a>. 
  For more ino go to <a href="www.apple.com">Apple.com</a> 
  or to <a href="www.appleblog.com">Appleblog.com</a>
', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DOMXPath($dom);

foreach ($xpath->query("//a") as $link) {
    $href = $link->getAttribute('href');

    // link does not have a www.laptops.com in it, add rel attribute
    if (strpos($href, 'www.laptops.com') === false) {
        $link->setAttribute("rel", "nofollow noopener");
    }
}

echo $dom->saveHTML();

结果:

<p>Hello World have a look at <a href="www.laptops.com/apple">Apple Laptops</a>. 
  For more ino go to <a href="www.apple.com" rel="nofollow noopener">Apple.com</a> 
  or to <a href="www.appleblog.com" rel="nofollow noopener">Appleblog.com</a>
</p>

https://3v4l.org/DseDi

【讨论】:

  • 这个。如果它必须在 PHP 中! DOM 类摇滚!
  • 谢谢你,为我工作。需要为 UTF-8 和错误抑制添加一些代码: $sHTML = mb_convert_encoding($sRawValue, 'HTML-ENTITIES', 'UTF-8'); $libxml_previous_state = libxml_use_internal_errors(true); $oDom->loadHtml($sHTML, LIBXML_HTML_NODEFDTD | LIBXML_NOERROR | LIBXML_NOWARNING); // 处理错误 libxml_clear_errors(); // 恢复 libxml_use_internal_errors($libxml_previous_state);
【解决方案2】:

使用一点 jQuery 会容易得多。

<script type="text/javascript">
$(document).ready(function(){
    $('a').each(function(){
        let href = $(this).prop('href');
        if (!href.search('laptops.com')) {
            $(this).prop('rel', 'nofollow');
        }
    });
});
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2013-01-10
    • 2014-11-29
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多