PHP Regex перемещение выделения в другое место в строке

#php #regex

#php #регулярное выражение

Вопрос:

В настоящее время у меня есть это регулярное выражение:

 $text = preg_replace("#<sup>(?:(?!</?sup).)*$key(?:(?!</?sup).)*</sup>#is", '<sup>'.$val.'</sup>', $text);
  

Цель регулярного выражения — взять <sup>[stuff here]$key[stuff here]</sup> и удалить содержимое в [stuff here] расположениях.

Что я на самом деле хотел бы сделать, это не удалить $key[stuff here]</sup> , а просто переместить материал в $key</sup>[stuff here]

Я пробовал использовать $1-$4 и \1-\4 , и, похоже, я не могу получить текст, который будет добавлен после </sup>

Комментарии:

1. Не используйте regexp с HTML!

2. Здесь это было весьма спорно. Но, как это показывает, в некоторых случаях regex подходит даже для HTML.

Ответ №1:

Попробуйте это;

 $text = preg_replace(
  '#<sup>((?:(?!</?sup).)*)'.$key.'((?:(?!</?sup).)*)</sup>#is', 
  '<sup>'.$val.'</sup>12', 
  $text
);
  

Бит (?:…) * на самом деле не является вложенным шаблоном и поэтому недоступен с использованием обратных ссылок. Кроме того, если вы используете ‘ вместо чем ‘ для строковых литералов, вам нужно будет только экранировать и ‘

// Приветствия, Мортен

Ответ №2:

Вы должны объединить preg_match(); и preg_replace();

  1. Вы сопоставляете желаемый материал с помощью preg_match() и сохраняете в переменной.
  2. Вы заменяете тем же регулярным выражением пустую строку.
  3. Добавьте переменную, в которую вы сохраняете, в конце.