Вопрос или проблема
Я хотел бы заменить несколько слов в содержании постов. Например.
Оригинал:
Вот моя тестовая строка.
Которую нужно заменить на первое тестовое слово в строке.
Ожидаемая строка:
Вот моя <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", на гиперссылки, но сталкиваетесь с несколькими проблемами:
- Уже существующие ссылки: Если слово уже находится в гиперссылке, например, "test", замена приведёт к некорректному вложению тегов.
- Слова с предшествующими символами: Вам необходимо обрабатывать такие случаи, как "test,", чтобы заменить только "test", а не подстроку в других словах.
- Чувствительность к регистру: Необходимо учитывать регистр в тексте для точной замены.
- Применение регулярных выражений: Для сложных сценариев лучше использовать регулярные выражения.
Рекомендации по решению
-
Проверка существующих ссылок:
Перед заменой слова вам следует проверить, находится ли оно уже в гиперссылке. Используйте регулярное выражение для поиска слова, заключенного в тег<a>
. Например:if (preg_match('/<a[^>]*>(.*?)<\/a>/', $content)) { // Слово уже является частью гиперссылки, пропустите замену. }
-
Регулярные выражения для проверки:
Необходимо использовать регулярные выражения для точной проверки словообразования и существования символов:$pattern = '/\btest\b(?![^<]*<\/a>)/i'; // ищет только целевое слово с учётом границ слова
-
Код функции замены:
Вот обновлённая версия вашей функции с учетом рекомендаций: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; }
-
Тестирование:
Всегда после внесения изменений проводите тестирование с различными вариантами текста, чтобы удостовериться, что ваша функция работает корректно и не вызывает ошибок в случае наличия непредвиденных ситуаций.
Заключение
Грамотно заменять текст на гиперссылки в вашем контенте – это задача, требующая внимательности к деталям. Важно предусмотреть все возможные сценарии: наличие предшествующих гиперссылок, правильность выделения слов с учётом пунктуации и регистров. Внедрив вышеуказанные методы и регулярные выражения, вы создадите надежный механизм замены, который значительно повысит качество и интерактивность ваших текстов.