Как заменить определенное слово на другое в строке, не затрагивая другие части этой строки?

Как можно заменить все слова "bryan" на "betty" в тексте, за исключением ситуаций, когда "bryan" используется в ссылке? При этом нужно учитывать, что замена должна производиться только целиком, если "bryan" встречается самостоятельно или в составе слов. В настоящее время использую код <code class="php">$field=str_replace('bryan','betty',$field);</code>, который заменяет все вхождения "bryan", в том числе и в ссылках. Возможно ли реализовать данное требование?
  • 25 августа 2024 г. 7:14
Ответы на вопрос 2
Да, это возможно. Можно воспользоваться регулярными выражениями для выполнения замены слова "bryan" на "betty" только в тех случаях, когда оно не находится внутри тега ссылки.

Пример кода на PHP:

```php
$field = 'Пример текста со словом bryan и <a href="http://example.com/bryan">ссылкой на bryan</a>.';

$field = preg_replace('/\b(bryan)\b(?![^<]*>)/', 'betty', $field);

echo $field;
```

В данном примере использовано регулярное выражение, которое ищет слово "bryan" (\b(bryan)\b) только если за ним не следует символ ">", что позволяет исключить случаи, когда "bryan" находится внутри тега ссылки.
<?php

// Исходный текст, в котором будем искать и заменять слова
$field = "
libero bryan, 
sit amet adipiscing sem neque sed ipsum.bryan 
bfringilla mauris sit amet nibh. https://site.com/member/bryan.html?r=nk07w, 
https://site.com/member/bryan-t.html?r=nk07w. 
https://site.com/bryan/test.html?r=nk07w Donec bibendum";

// Регулярное выражение для поиска URL и слова 'bryan'
// - https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)
//   Это паттерн для нахождения URL. Он включает http или https, необязательный www, и остальную часть URL.
// - (\bbryan\b)
//   Это паттерн для нахождения слова 'bryan' в тексте. Используем границы слова (\b) чтобы найти точное совпадение.
//   Скобки вокруг \bbryan\b создают захватывающую группу, которую мы будем использовать в функции обратного вызова.
$pattern = '/https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/=]*)|(\bbryan\b)/';

// Заменяем слово 'bryan' на 'betty', но только если оно не является частью URL
$field = preg_replace_callback(
    $pattern, // Паттерн для поиска URL и слова 'bryan'
    function ($matches) {
        // Функция обратного вызова, которая вызывается для каждого совпадения
        // $matches - массив, где:
        // - $matches[0] содержит всё совпадение (URL или слово 'bryan')
        // - $matches[1] содержит только слово 'bryan', если оно найдено
        
        // Если $matches[1] существует, это значит, что найдено слово 'bryan' (вторая группа в паттерне)
        // В таком случае заменяем его на 'betty'
        // Иначе возвращаем оригинальное совпадение (это был URL, который не нужно изменять)
        return isset($matches[1]) ? 'betty' : $matches[0];
    },
    $field // Исходный текст, который мы будем обрабатывать
);

// Выводим результат
echo $field;
Похожие вопросы