$str = preg_replace('/(\blo[a-z]+\b)/', '$1 can', $str);
Проблема с ответом Роборга:
\w
соответствует цифрам и подчеркиванию, которые не являются действительно символами слова на человеческом языке, поэтому он будет соответствовать 'lo_fi' или '__lo __'.
- это также будет соответствовать словам, которые не начинаются с
lo
, например, «slorem», или даже словам, которые заканчиваются на lo
, таким как «allo».
\b
гарантирует, что lo
следует за переносом слов (нулевая ширина), а [a-z]+
гарантирует, что по крайней мере один алфавитный символ следует за 'lo'.
Редактировать: Я вижу, что текст вопроса говорит «содержит», а не «начинается с», и в этом случае первый \b
может быть опущен.
Редактировать 2: Обратите внимание, что ни одно из этих решений не является международно-безопасным. Я не проверял это, но PHP RegEx довольно неплох, поэтому я предполагаю, что он будет работать:
$str = preg_replace('/(\blo[a-z\p{L}]+\b)/', '$1 can', $str);