@ventacom

Как удалить регулярным выражением все шорт-коды за исключением одного?

Имеются шорт-коды вида [gallery type="carrousel"] [product id="1"] и т.п. Обработчик находит все шорткоды в тексте, обрабатывает те, что указаны верно, а если есть "левый" шорт-код, для которого нет своего шаблона вывода, то он игнорируется и в последствии будет удален регулярным выражением:
$text = preg_replace('/\[[^\]]*\]/', '', $text);
Удалит все содержимое в квадратных скобках, включая сами скобки.
Но сейчас возникла необходимость внедрить глобальный шорткод [store name="phone"] (набор атрибутов может быть разный, ключевое то, что название шорт-кода store), который обрабатывается в последнюю очередь, и нужно чтобы он не был удален той регуляркой. Т.е все другие удлены, кроме него/
Подскажите, пожалуйста, как это реализовать. Заменять квадратные скобки на фигурные или что-то иное не хочется, чтобы все шорткоды имели один вид
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
@dodo512
$text = preg_replace('~(\[store [^\]]*\])|\[[^\]]*\]~', '$1', $text);


Или
$text = preg_replace('~\[store [^\]]*\](*SKIP)(*F)|\[[^\]]*\]~', '', $text);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Aco
@Aco
Заклинатель кода
Там где появился один тег который нельзя срезать - появится и другой. Я бы взял подконтроль что срезать, а что нет через preg_replace_callback:
$txt = 'one [gallery type="carrousel"] two [product id="1"] three [store name="phone"] four';

$result = preg_replace_callback('/\[.*?\]/usS', function ($tag) {
	if (stripos($tag[0], "[store ") === false) {
		return '';
	} else {
		return $tag[0];
	}
}, $txt);

var_dump($result); // string(41) "one  two  three [store name="phone"] four"


Регуляркой не обрабатывается случай когда ] будет в строке тега — [gallery type="injection]"]. Тут будет кривизна, надо улучшить регулярку. Но самый надженный способ избежать иньекции скобок - парсить через токенайзер token_get_all, это посложнее реализовать, но проще обрабатывать такие edge-случаи.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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