Как сделать замену игнорируя теги <a>

Статус
В этой теме нельзя размещать новые ответы.

verfaa

Профессор
Регистрация
29 Янв 2007
Сообщения
417
Реакции
49
Использую PHP 8.2
Есть текст:

HTML:
<p>Learn how to adjust your downloads settings to get Netflix to automatically data it for you with its Smart Downloads features, and how to manage downloads for countries with restricted licenses. For more, manage Netflix's hidden menu or see CNET's reviews of all the streaming services</p>

Я написал код, для замены некоторых слов на ссылки:

PHP:
$text = preg_replace_callback(
        "#(manage|reviews|module)#m",
        function (array $matches) use (&$url_my_domain) {
           return "<a href=\"$url_my_domain\">{$matches[1]}</a>";
        },
        $text
    );

Но на выходе часто получаю такой текст:

HTML:
<p>Learn how to adjust your downloads settings to get Netflix to automatically data it for you with its Smart Downloads features, and how to <a href="https://site.net/blog/post/data-<a href="https://site.com/page.html">reviews</a>-who-need-it">manage</a> downloads for countries with restricted licenses. For more, manage Netflix's hidden menu or see CNET's reviews of all the streaming services</p>

Т.е. при последующих проходах скрипт берёт анкор из тела ссылки, которую он вставил на предыдущих итерациях. Т.е. я получаю такое:

HTML:
<a href="https://site.net/blog/post/data-<a href="https://site.com/page.html">reviews</a>-who-need-it">manage</a>

Подскажите как написать регулярное выражение, которое игнорировало бы совпадения внутри тегов <a ... </a>
 
Пробуйте так:

PHP:
$text = preg_replace_callback(
    '/\b(manage|reviews|module)\b(?![^<]*<\/a>)/',
    function (array $matches) use (&$url_my_domain) {
        return "<a href=\"$url_my_domain\">{$matches[1]}</a>";
    },
    $text
);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху