Подскажите как можно в php реализовать выделение текста жирным начертанием в сучайном порядке не более 3 строк в тексте.
К примеру есть такой текст
<p>В одном солнечном городе жили симпатичные и необычные мальчик Петя и девочка Тома. Тома была «царевной-несмеяной», так как никогда не улыбалась и часто плакала. А Петя был трусом, ему не хватало храбрости. И вот мама Пети и папа Томы решили обратиться к доктору.</p>
<p>Доктор был необычный, у него были леденцы от страха, а с помощью других конфет он вполне мог лечить от злости и коварства, глупости, грусти, вранья, болтовни.</p>
А нужно чтобы было так
<p>В одном солнечном <strong>городе жили симпатичные и необычные мальчик Петя и девочка Тома</strong>. Тома была «царевной-несмеяной», так как никогда не улыбалась и часто плакала. А Петя был трусом, ему не хватало храбрости. И вот мама Пети и папа Томы решили обратиться к доктору.</p>
<p>Доктор был необычный, <strong>у него были леденцы от страха, а с помощью других конфет</strong> он вполне мог лечить от злости и коварства, глупости, грусти, вранья, болтовни.</p>
$text = '<p>1 2 3 4 5 6 7 8 9</p>'; // Текст
$max = 5; // Сколько максимальное кол-во слов
$text= mb_ereg_replace("/\s{2,}/"," ",$text); // Убираем дубликаты пробелов
$array = explode(' ', strip_tags($text)); // Строку в массив, при этом убирая теги
//$array = explode(' ', mb_substr($text, 3, -4)); // Если вы гарантируете что <p> и </p> всегда будут в начале и конце строки
$strong_1 = array_rand($array); // Получаем первое слово
$strong_2 = mt_rand(0, $max); // И сколько слов выделяем
if ($strong_2 > 0) { // Если 0, то замен не будет (если всегда нужны замены, то смотрим выше и меняем 0 на 1)
$array[$strong_1] = '<strong>' . $array[$strong_1]; // Помечаем первый элемент
$strong_2 += $strong_1; // Получаем второй
if ($strong_2 > (count($array) - 1)) { // Проверяем, не выходит ли он за рамки
$strong_2 = count($array) - 1; // Если выходит, меняем на последний элемент
}
$array[$strong_2] .= '</strong>'; // Помечаем второй
}
$text = '<p>' . implode(' ', $array) . '</p>'; // Собираем строку обратно
echo $text;
Можно рассмотреть вариант с помощью array_splice и array_merge:
$string = '<p>1 2 3 4 5 6 7 8 9</p>';
preg_match('~<p>(.+)</p>~sm', $string, $matches);
$array = explode(' ', $matches[1]);
$rand = mt_rand(1, 5);
$rand2 = mt_rand(0, count($array) - $rand);
$result = array_merge(
array_slice($array, 0, $rand2),
array_merge(
['<strong>'],
array_slice($array, $rand2, $rand),
['</strong>']
),
array_slice($array, $rand2 + $rand)
);
echo '<p>'. implode(' ', $result) .'</p>';
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости