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 (), но я не знаю, как это решить.

"Я знаю, что это должно быть возможно с preg_match ()" .... не делай этого ... даже не думай, он тебя услышит!
CD001 13.07.2018 15:37

это должен быть PHP? В jQuery это безумно просто

delboy1978uk 13.07.2018 15:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
141
2

Ответы 2

Вам следует избегать использования регулярных выражений, вместо этого вы должны использовать 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

Этот. Если он ДОЛЖЕН быть на PHP! ДОМ-классы - это круто!

delboy1978uk 13.07.2018 15:58

Спасибо, у меня сработало. Необходимо добавить код для UTF-8 и подавления ошибок: $ sHTML = mb_convert_encoding ($ sRawValue, 'HTML-ENTITIES', 'UTF-8'); $ libxml_previous_state = libxml_use_internal_errors (истина); $ oDom-> loadHtml ($ sHTML, LIBXML_HTML_NODEFDTD | LIBXML_NOERROR | LIBXML_NOWARNING); // обрабатываем ошибки libxml_clear_errors (); // восстанавливаем libxml_use_internal_errors ($ libxml_previous_state);

jb7AN 18.07.2018 12:12

Это было бы намного проще с небольшим количеством 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>

Другие вопросы по теме