Regex - Как заменить последние 3 слова строки на PHP

Попытка обернуть последние 3 слова в

$str = 'Lorem ipsum dolor sit amet';
$h2 = preg_replace('/^(?:\w+\s\w+)(\s\w+)+/', '<span>$1</span>', $str);
3 ответа

Вот:

$h2 = preg_replace('/(\w+\s\w+\s\w+)$/', '<span>$1</span>', $str);

Начиная с последних трех слов, сделайте левую сторону (от начала) открытой, чтобы иметь совпадение.


Сабудж Хасан рассматривает числа и _ как часть слова, так что используйте это, если это имеет смысл.

Предполагая, что "слова" - это буквы, разделенные пробелом:

$str = 'Lorem ipsum dolor sit amet';
$h2 = preg_replace('/([a-z]+ [a-z]+ [a-z]+)$/i', '<span>$1</span>', $str);

echo $h2;

Если вы хотите, чтобы любое непробелое слово считалось словом, тогда:

$h2 = preg_replace('/(\S+ \S+ \S+)$/', '<span>$1</span>', $str);


Нет смысла использовать регулярное выражение здесь вообще, если вы определяете слова как ограниченные одним пробелом. Вместо этого вы можете использовать базовые манипуляции с строкой, чтобы получить желаемый результат.

$str = ...; // your input string
$words_with_offsets_in_key = str_word_count($str, 2);
$word_count = count($word_offsets);
if($word_count >= 3) {
 // we have at least 3 words
 // find offset of word three from end of array of words
 // grab third item from end of array
 $third_word_from_end = array_slice($words_with_offsets_in_key, $word_count - 3, 1);
 // inspect its key for offset value in original string
 $offset = key($third_word_from_end);
 // insert span into string
 $str = substr_replace ( $str , '<span>' , $offset, 0) . '</span>';
}

licensed under cc by-sa 3.0 with attribution.