Регулярное выражение по удалению ссылок в тексте

Есть такая строка с ссылками

Статья подготовлена журналистом Иваном Ивановый (<a href="https://www.facebook.com/">FaceBook</a>), при поддержке IT-портала (<a href="http://test-site.com">TestSite</a>)

Как сделать так, чтоб ссылка на IT-портал <a href="http://test-site.com">TestSite</a> оставалась, а все другие ссылки удалялись с помощью регулярного выражения и заменялись на Ссылки запрещены?


Как пробовал решить задачу

Регулярное выражение /\s?<a[^>]*?>.*?<\/a>\s?/si - оно удаляет все теги ссылок, и заменяет их на Ссылки запрещены: Статья подготовлена журналистом Иваном Ивановый (Ссылки запрещены), при поддержке IT-портала (Ссылки запрещены)

Как сделать регулярное выражение которое будет пропускать определенную ссылку?


Ответы (2 шт):

Автор решения: dIm0n

Вот так вот:

<a(?:(?!http:\/\/test-site\.com).)+?<\/a>

Тест https://regexr.com/5aalp

Статья подготовлена журналистом Иваном Ивановый (<a href="https://www.facebook.com/" >FaceBook</a>), при поддержке IT-портала (<a href="http://test-site.com" >TestSite</a>)

→ Ссылка
Автор решения: Studying Again

Добился автоматизма данной задачи. Комментарии в коде сделал, может кому пригодиться. За определенные термины с доменами прошу не ругать, Я учусь

Отдельное еще раз спасибо dIm0n за помощь с регулярным выражением


Задание:

Тестовый домен: testing.com, протокол http://

Строка: Статья подготовлена журналистом Иваном Ивановый (FaceBook), при поддержке IT-портала testing.com;

Удалить все ссылки с помощью регулярного выражения и заменялись на Ссылки запрещены кроме ссылки на IT-портал <a href="http://testing.com">testing.com</a>


Решение:

<?php 
// Определение имени хоста
$linkCurrentSite = $_SERVER['HTTP_HOST'];
    
// Определение протокола http:// или https://
if (isset($_SERVER['HTTPS']) !== '') $connectionProtocol = 'https:'; $connectionProtocol = 'http:';
    
// Определение верхнего уровня домена с переменной $linkCurrentSite
$topLevelDomain = substr($linkCurrentSite, 0, (strpos($linkCurrentSite, '.') - strlen($linkCurrentSite)));
    
// Определение нижнего уровня домена с переменной $linkCurrentSite
$lowerLevelDomain = substr($linkCurrentSite, strpos($linkCurrentSite, '.'), strlen($linkCurrentSite));
    
// Произвольный текст с ссылкой для удаления и пропуска регулярным выражением
$arbitraryString = 'Статья подготовлена журналистом Иваном Ивановый (<a href="https://www.facebook.com/" target="_blank">FaceBook</a>), при поддержке IT-портала  <a href="' . $connectionProtocol . '//' . $linkCurrentSite . '" target="_blank">' . $linkCurrentSite . '</a>';
    
// Регулярное выражение, которое пропустит ссылку соответствующую ссылке из трех частей $connectionProtocol + $topLevelDomain + $lowerLevelDomain
$regularExpressionLinks = '/<a(?:(?!' . $connectionProtocol . '\/\/' . $topLevelDomain . '\\' . $lowerLevelDomain . ').)+?<\/a>/';
    
// Результат работы регулярного выражения, где ссылки не прошедшие проверку заменяться на 'Ссылки запрещены'
echo preg_replace($regularExpressionLinks, '<u>Ссылки запрещены</u>', $arbitraryString);
?>

Результат: Статья подготовлена журналистом Иваном Ивановый (Ссылки запрещены), при поддержке IT-портала testing.com

→ Ссылка