@Nikelamoc

Как обернуть словосочетание в тег с проверкой не обернуто ли оно уже?

День добрый, есть простое предложение
Для обычного потребителя всегда была весьма сложной задачей выбрать между Canon и Nikon, потому как ...


Надо обернуть названия брендов в тег , чтобы в итоге вышло что-то типа такого:
Для обычного потребителя всегда была весьма сложной задачей выбрать между <span>Canon</span> и <span>Nikon</span>, потому как ...


Список брендов есть в массиве.

На первый взгляд простая задача для preg_replace, но есть нюанс, надо предотвратить повторное оборачивание.
То есть если у нас уже есть часть брендов обернутых в спан, то после прогона через preg_replace мы получим <span><span>Nikon</span></span>

Не смотря на первичную заурядность такой проблему уже неделю хоть ты тресни не могу найти решение .
Чистить все теги перед прогоном нельзя, там все форматирование слетит.
  • Вопрос задан
  • 142 просмотра
Решения вопроса 2
Stalker_RED
@Stalker_RED
$keywords = ['Canon', 'Nikon'];
$text = 'Для обычного потребителя всегда была весьма сложной задачей выбрать между <span>Canon</span> и <span>Nikon</span>, потому как ...';

foreach($keywords as $keyword) {
    $pos = mb_strpos($text, $keyword);
    if ($pos > 0) {
        if ($text[$pos - 1] === '>') {
            // перед этим словом есть какой-то тег
        } else {
            // ...
        }
    }
    // надо бы проверить, может это слово встречается больше одного раза
}
Ответ написан
Комментировать
@zhainar
Гуглю за вас
Можно просто уже текущие обернутые очистить от тегов.

$keywords = ['Canon', 'Nikon'];
$text = 'Для обычного потребителя всегда была весьма сложной задачей выбрать между <span>Canon</span> и <span>Nikon</span>, потому как ...';

$wrapped_keywords = array_map(function($el){ return "<span>{$el}</span>"; }, $keywords);

$text = str_replace($wrapped_keywords, $keywords, $text);

$text = str_replace($keywords, $wrapped_keywords, $text);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@balamyt92
; select * from users; --
допустим вот такой регуляркой делать проверку '/(?!>)Canon(?!<\/)/i' но тут не все случаи учтены. Дорабатывайте под свои нужды.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы