Замена символов по краям каждого слова

296
03 ноября 2017, 11:47

Новое Я не понимаю, почему звёздочки не меняются на em? Я же сказал найти слово, если оно начинается на * и заканчивается на *

echo preg_replace('#\b(?<=\*)(.+)(?=\*)\b#', '<em>$1</em>', 'This text has *two* *italic* bits');

Почему выводятся только последние буквы слова, не полностью слово?

echo preg_replace('#\*([a-z])+\*#', '<em>$1</em>', 'This *text* is *italic*');
Answer 1

В случае с \b(?<=\*)(.+)(?=\*)\b звездочки являются частью предварительных блоков просмотра, т.е. они не становятся частью заменяемой строки. Тут ещё можно добавить то, что (.+) — "жадный шаблон", т.е. найдёт все от первой звездочки до последней, (.+?) выглядит предпочтительнее, так как найдет текст от первой звездочки до ближайшей справа.

В #\*([a-z])+\*# у вас захватывающая подмаска захватывает только по одной букве, квантификатор должен быть внутри подмаски.

Используйте

preg_replace('#\*([a-z]+)\*#', '<em>$1</em>', 'This *text* is *italic*');

См. онлайн-демо.

Если необходимо добавить поддержку всех букв Юникода:

preg_replace('#\*(\p{L}+)\*#u', '<em>$1</em>', 'This *text* is *italic*');

где \p{L} находит любую букву Юникода.

Если стоит задача найти звездочку, после которой стоит буква, и далее любой текст, завершающийся буквой, после которой стоит звездочка, можно использовать

preg_replace('#\*(\p{L}(?:.*?\p{L})?)\*#u', '<em>$1</em>', 'This *text* is *italic*');

или

preg_replace('#\*(\p{L}(?:[^*]*\p{L})?)\*#u', '<em>$1</em>', 'This *text* is *italic*');

Тут \p{L}(?:[^*]*\p{L})? найдет букву, после которой опционально следует 0 и более любых символов, отличных от *, и вновь любая буква. Т.е. найдутся *Да, нет*, а * \\ * найдены не будут.

READ ALSO
JS получить прогресс загрузки файла из PHP

JS получить прогресс загрузки файла из PHP

Пытаюсь отобразить процент загрузки файлов, которые загружаю через GET методПри переходе по ссылке http://site/updates/ загружаются файлы из массива,...

228
Отправка email-уведомлений с записью в cache-файл. PHP

Отправка email-уведомлений с записью в cache-файл. PHP

Есть функция отправки email-уведомлений на почту администратораФункция рабочая (уведомление приходит), но она срабатывает каждый раз когда...

223