preg_replace для множественной замены в строке

151
03 октября 2018, 12:40

Есть регулярка

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" но так вроде всегда можно было, почему сейчас не работает?

Answer 1

Проверяйте подстроку 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
READ ALSO
Составление JSON из БД

Составление JSON из БД

Есть рабочий sql-запрос, по которому надо составить JSON:

215
Прикрепить изображение к посту, VK API

Прикрепить изображение к посту, VK API

Не выходит прикрепить изображение к посту в группеПо порядку: определяю путь к пикче, передаем в метод getWallUploadServer айди группы без минуса и токен

174
google ReCaptcha во время парсинга данных

google ReCaptcha во время парсинга данных

Делаю инструмент для удобства работы с неким сторонним сайтом, на одном из этапов столкнулся с проблемой, при авторизации через CURL, на стороннем...

169
Как написать свой планировщик задач?

Как написать свой планировщик задач?

У меня есть скрипт, мне нужно чтоб он срабатывал два раза в деньКак на php написать, чтоб этот скрипт так работал?

151