Как заменить длинное тире с помощью str_replace?

Ссылка скопирована
PHP
1 ответ

Есть в WP заголовок записи, к примеру такой:
"Мы - самая лучшая компания"
В качестве тире при редактировании поста набран дефис кнопкой -
Во фронте WP выводит длинное тире, такое: —
Я хочу заменить на тег переноса - br
Делаю так:

<?php echo str_replace(' - ', '<br>', get_the_title()); ?>

<?php echo str_replace(' - ', '<br>', get_the_title()); ?>

И не работает. Пробовал в str_replace указывать дефис, длинное тире, копировать тире с фронта - не работает.
P.S. Я в курсе, что можно в редактировании записи в админке вместо тире указать br, но это не подходит, т.к. заголовок используется дли alt изображений, соответственно, придется br на -

Дополнительно:

& #8211;
Уберите пробел между & #

  • спасибо, помогло. Только & #8212; был код символа.

Ответы:

Вам выше уже подсказали в чем дело, но замечу, что у str_replace есть крутой аналог это preg_replace - позволяет сделать замену по регулярному выражению. Очень удобная вещь, рекомендую попробовать использовать его, если в каких-то местах пробелы могут как быть, так и не быть, в регулярке все это можно предусмотреть.

  • пробовал.
    Регулярки
    /s+-s+/u
    /s+—s+/u
    /s+Ws+/u
    не срабатывали. Очень странно, что последняя не работала, т.к., по идее, она должна искать не букву, окруженную пробелами.
    При этом, если, например, тут тестировать регулярки, то все было ок.
  • denism300, иногда проблема бывает у хостера. Сделайте тестовый php файл и напишите в тех. поддержку, типа вот здесь работает, а у вас на хостинге не работает. Мол, почему?

    P. S. https://phpize.online это сайт для запуска своего php кода онлайн. Бывает удобно, когда надо что-нибудь проверить.

  • zkrvndm, на моем хостинге так же, если вставить строку текстом, то работали и регулярки и
    <?php echo str_replace(' - ', '<br>', get_the_title()); ?>

    <?php echo str_replace(' - ', '<br>', get_the_title()); ?>

    а если ее выводить функцией WP
    get_the_title()
    то не работали.

  • denism300, посимввольно сравни вывод от get_the_title(), возможно юникод коды другие.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Backend-редакция Ответ

WordPress может типографически заменять дефис на длинное тире через фильтры форматирования, например wptexturize. Поэтому в базе и в админке у вас один символ, а на фронте выводится уже другой. Если вы делаете str_replace(' - ', ... get_the_title()) до применения типографики или после неё не тем символом, замена не сработает.

Самый надёжный вариант — обработать несколько возможных вариантов:

$title = get_the_title();
$title = str_replace([' - ', ' – ', ' — ', '–', '—'], '<br>', $title);
 
echo wp_kses($title, ['br' => []]);

$title = get_the_title(); $title = str_replace([' - ', ' – ', ' — ', '–', '—'], '<br>', $title); echo wp_kses($title, ['br' => []]);

Если WordPress уже превратил символ в HTML-сущность, можно сначала декодировать:

$title = html_entity_decode(get_the_title(), ENT_QUOTES, 'UTF-8');
$title = str_replace([' - ', ' – ', ' — '], '<br>', $title);

$title = html_entity_decode(get_the_title(), ENT_QUOTES, 'UTF-8'); $title = str_replace([' - ', ' – ', ' — '], '<br>', $title);

Но для alt изображений действительно нельзя использовать <br>. Поэтому лучше сделать две функции: одна для визуального заголовка, другая для plain text. Например:

$visual_title = str_replace([' - ', ' — '], '&lt;br&gt;', get_the_title());
$alt_title = wp_strip_all_tags(get_the_title());

$visual_title = str_replace([' - ', ' — '], '&lt;br&gt;', get_the_title()); $alt_title = wp_strip_all_tags(get_the_title());

Не вставляйте br прямо в заголовок записи в админке, если этот заголовок используется в SEO, хлебных крошках, alt и меню. Правильнее менять только вывод в конкретном шаблоне.

Если замена должна применяться только к конкретному заголовку на странице, не вешайте её глобально на фильтр the_title без условий. Такой фильтр затронет меню, хлебные крошки, title в админке и SEO-плагины. Безопаснее сделать отдельный вывод в нужном шаблоне или короткую helper-функцию, которую вы вызываете только в hero/карточке.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно