Новое Я не понимаю, почему звёздочки не меняются на 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*');
В случае с \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 и более любых символов, отличных от *, и вновь любая буква. Т.е. найдутся *Да, нет*,
а * \\ * найдены не будут.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости