Замените текст на гиперссылки

Вопрос или проблема

Я хотел бы заменить несколько слов в содержании постов. Например.

Оригинал:

Вот моя тестовая строка. 
Которую нужно заменить на первое тестовое слово в строке.

Ожидаемая строка:

Вот моя <a href="https://wordpress.stackexchange.com/questions/317374/link"> тестовая </a> строка. 
Которую нужно заменить на первое тестовое слово в строке.

Я пробовал, но есть несколько сценариев, где я столкнулся с проблемами.

Когда это слово имеет предустановленную ссылку вместе со словом. Например

Вот моя <a href="https://wordpress.stackexchange.com/questions/317374/test case link"> тестовый случай </a> строка. 
Которую нужно заменить на первое тестовое слово в строке.

Поэтому моя функция разделила это на два слова, как

Вот моя <a href="https://wordpress.stackexchange.com/questions/317374/link"> тестовая </a> <a href="https://wordpress.stackexchange.com/questions/317374/test case link"> случай </a> строка.
Которую нужно заменить на первое тестовое слово в строке.

== Мое решение ====

add_filter('the_content' , 'update_content');

function update_content($content){
        if((is_singular()){
            $termsList = array(
                 "https://wordpress.stackexchange.com/questions/317374/test" => '<a href="https://wordpress.stackexchange.com/questions/317374/test">тест</a>'
            );

            foreach($termsList as $word => $term_link){

                //$content = str_replace($word , $replacement , $content , $count);
                //Преобразовать в нижний регистр
                $str_content = strtolower($content);
                $str_word = strtolower($word);


                //Получить позицию слова
                $position = strpos($str_content, $str_word , 0); 
                //Получить точное слово с учетом регистра 
                $match_string = substr ($content , $position , strlen($word) );

                //Подготовить замену
                $replacement="<a href="".$term_link.'">'.$match_string.'</a>';


                if(!empty($position)){
                    //Заменить слово
                    $content = substr_replace($content, $replacement, $position, strlen($word));
                }

            }
        }

        return $content;
    }

Это довольно сложная проблема PHP (а не WP), если учитывать все возможности.

Если вы замените тест на <a href="#">тест</a>, вы столкнетесь с проблемами, если контент уже содержит <a href="https://wordpress.stackexchange.com/questions/317374/?">тест</a>, потому что в этом случае результат будет <a href="https://wordpress.stackexchange.com/questions/317374/?"><a href="#">тест</a></a>

Таким образом, прежде чем делать замену, вам нужно проверить, является ли тест уже ссылкой. Это не так просто, потому что вы не можете просто просматривать <a href="https://wordpress.stackexchange.com/questions/317374/...">тест</a>. В конце концов, у вас может быть что-то вроде <a href="https://wordpress.stackexchange.com/questions/317374/...">это мой тест, да!. Или тест может быть подстрокой другого слова, например протестировать. Чтобы предотвратить последнюю ситуацию, вы можете проверить для тест, но тогда вы можете пропустить тест,.

Еще один момент, который следует учесть: если уже есть ссылка вокруг тест, хотите ли вы сохранить ее или заменить?

Таким образом, в зависимости от ваших нужд, вам придется создать регулярное выражение, которое выполняет сложное распознавание шаблона в вашем контенте, чтобы убедиться, что оно делает именно то, что вам нужно. Для помощи с регулярными выражениями, попробуйте Stack Overflow.

Ответ или решение

Замена текста на гиперссылки в контенте постов

Введение

В условиях современных цифровых коммуникаций создание интерактивного контента является неотъемлемой частью эффективного взаимодействия с аудиторией. Если вы хотите заменить определенные слова в текстах постов гиперссылками, важно учитывать множество аспектов, чтобы избежать нарушений структуры HTML и сохранить правильное отображение текста. Здесь мы рассмотрим, как можно это сделать, основываясь на представленном коде PHP и вопросах, возникающих в процессе.

Проблема

Вы хотите заменить в тексте слова, такие как "test", на гиперссылки, но сталкиваетесь с несколькими проблемами:

  1. Уже существующие ссылки: Если слово уже находится в гиперссылке, например, "test", замена приведёт к некорректному вложению тегов.
  2. Слова с предшествующими символами: Вам необходимо обрабатывать такие случаи, как "test,", чтобы заменить только "test", а не подстроку в других словах.
  3. Чувствительность к регистру: Необходимо учитывать регистр в тексте для точной замены.
  4. Применение регулярных выражений: Для сложных сценариев лучше использовать регулярные выражения.

Рекомендации по решению

  1. Проверка существующих ссылок:
    Перед заменой слова вам следует проверить, находится ли оно уже в гиперссылке. Используйте регулярное выражение для поиска слова, заключенного в тег <a>. Например:

    if (preg_match('/<a[^>]*>(.*?)<\/a>/', $content)) {
       // Слово уже является частью гиперссылки, пропустите замену.
    }
  2. Регулярные выражения для проверки:
    Необходимо использовать регулярные выражения для точной проверки словообразования и существования символов:

    $pattern = '/\btest\b(?![^<]*<\/a>)/i'; // ищет только целевое слово с учётом границ слова
  3. Код функции замены:
    Вот обновлённая версия вашей функции с учетом рекомендаций:

    add_filter('the_content', 'update_content');
    
    function update_content($content){
       if(is_singular()){
           $termsList = array(
               "test" => '<a href="https://wordpress.stackexchange.com/questions/317374/test">test</a>'
           );
    
           foreach($termsList as $word => $term_link){
               // Паттерн для проверки
               $pattern = '/\b'.$word.'\b(?![^<]*<\/a>)/i';
               $content = preg_replace($pattern, $term_link, $content);
           }
       }
    
       return $content;
    }
  4. Тестирование:
    Всегда после внесения изменений проводите тестирование с различными вариантами текста, чтобы удостовериться, что ваша функция работает корректно и не вызывает ошибок в случае наличия непредвиденных ситуаций.

Заключение

Грамотно заменять текст на гиперссылки в вашем контенте – это задача, требующая внимательности к деталям. Важно предусмотреть все возможные сценарии: наличие предшествующих гиперссылок, правильность выделения слов с учётом пунктуации и регистров. Внедрив вышеуказанные методы и регулярные выражения, вы создадите надежный механизм замены, который значительно повысит качество и интерактивность ваших текстов.

Оцените материал
Добавить комментарий

Капча загружается...