PHP: обнаружение и исправление исходящих ссылок в HTML

Мне нужна функция, которая исправляет ВСЕ исходящие ссылки в данном 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)», которая может определять, является ли ссылка исходящей или нет, но обнаруживает ВСЕ »< a … href = «{$ link}» …..> «части HTML-текста и фильтрация {$ link} создает проблемы. Я знаю, что это должно быть возможно с preg_match (), но у меня есть понятия не имею, как это решить.

0

Решение

Вы должны избегать использования регулярных выражений, вместо этого вы должны использовать DOMDocument а также DOMXPath.

<?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

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>
0

По вопросам рекламы [email protected]