Случайный strong

291
06 сентября 2018, 22:00

Подскажите как можно в php реализовать выделение текста жирным начертанием в сучайном порядке не более 3 строк в тексте.

К примеру есть такой текст

<p>В одном солнечном городе жили симпатичные и необычные мальчик Петя и девочка Тома. Тома была «царевной-несмеяной», так как никогда не улыбалась и часто плакала. А Петя был трусом, ему не хватало храбрости. И вот мама Пети и папа Томы решили обратиться к доктору.</p>
<p>Доктор был необычный, у него были леденцы от страха, а с помощью других конфет он вполне мог лечить от злости и коварства, глупости, грусти, вранья, болтовни.</p>

А нужно чтобы было так

<p>В одном солнечном <strong>городе жили симпатичные и необычные мальчик Петя и девочка Тома</strong>. Тома была «царевной-несмеяной», так как никогда не улыбалась и часто плакала. А Петя был трусом, ему не хватало храбрости. И вот мама Пети и папа Томы решили обратиться к доктору.</p>
<p>Доктор был необычный, <strong>у него были леденцы от страха, а с помощью других конфет</strong> он вполне мог лечить от злости и коварства, глупости, грусти, вранья, болтовни.</p>
Answer 1
$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;
Answer 2

Можно рассмотреть вариант с помощью 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>';
READ ALSO
Как сделать это более грамотно в Laravel

Как сделать это более грамотно в Laravel

У меня есть в базе данных 2 таблицы, новости и историяИстория само собой выводится на главной странице

263
Связать LDAP, MSSQL, PHP

Связать LDAP, MSSQL, PHP

Имеется сервер MSSQL и настроенные логины-пользрватели, привязанные к доменным учеткамХочу связать web приложение с базой так, чтобы при аутентификации...

271
OPENCV стек в KERNELBASE.dll

OPENCV стек в KERNELBASE.dll

работаю на VC++2010 после компиляции выдаёт ошибку Необработанное исключение в "0x751ec54f" в "OPCVexe": Исключение Microsoft C++: cv::Exception по адресу 0x0038f3f8

271
c++, boost::random: генерация случайных данных с равномерным распределёнием

c++, boost::random: генерация случайных данных с равномерным распределёнием

Приветствует, стоит задача на некотором действительном отрезке (условно от 00 до limit) случайно сгенерировать N точек, при этом точки должны...

274