Есть регулярка
https://regex101.com/r/DOYzGI/1/
Нужно emi обрамить тегом <i>, а mise тегом <u>
Вариант 1: Работает но не так как надо
http://sandbox.onlinephpfunctions.com/code/0f15f2705fe55b9fe643314124da18042079a2b7
Работает с ошибкой. В замене "SS$1YY" приклеивается к переменной
Вариант 2: Ошибка http://sandbox.onlinephpfunctions.com/code/0252eb0d4eae114b7e454e99b3e31e76a1502b29
Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$' in [...][...] on line 2
Я поменял "SS$1YY" на "SS{$1}YY" но так вроде всегда можно было, почему сейчас не работает?
Проверяйте подстроку emi таким образом, что бы ни слева ни справа от неё не было символа s. Иначе говоря, нужно исключить из поиска в подстроке emi те позиции, которые входят в подстроку mise:
$string = 'hemidemisemiquaver';
$pattern = '~(?<!s)(emi)(?!s)|(mise)~';
$replace = '<i>$1</i><u>$2</u>';
echo preg_replace($pattern, $replace, $string);
Результат:
h<i>emi</i><u></u>de<i></i><u>mise</u>miquaver
Но preg_replace() для этой задачи не подходит, т.к. в случае отсутствия совпадения во второй подмаске $2 в результирующую подстроку всё равно будет добавлена пара пустых тегов <u></u> (они ведь жёстко прописаны в строке замены).
Альтернативным вариантом будет preg_replace_callback() -- в теле callback-функции можно добавить условие с проверкой на соответствие для второй подмаски:
$string = 'hemidemisemiquaver';
$pattern = '~(?<!s)(emi)(?!s)|(mise)~';
echo preg_replace_callback($pattern, function ($mch) {
return empty($mch[2]) ? "<i>$mch[1]</i>" : "<u>$mch[2]</u>";
}, $string);
Результат:
h<i>emi</i>de<u>mise</u>miquaver
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости