PHP. Задание - выделить первую букву каждого предложения жирным шрифтом

Изначально заданий было несколько, но с ними я уже справился (реализовать постраничный вывод произвольного русского текста по k абзацев на страницу и определить количество символов, количество слов и количество предложений для каждого абзаца. Также выделил цветом все вхождения одного из слов)

Осталось последнее - выделить первую букву каждого предложения жирным шрифтом. Снизу привожу свой код, файла два.

Не судите строго, первые недели занятия прогой

index.php

$page = intval($_GET['page'] ?? 1);
    if ($page < 1) {
        $error = 'Запрошенная страница не существует';
        include "template/error.php";
        exit();
    }
    
    $text = 'Рассмотрим принцип работы двигателя внутреннего сгорания. Принцип работы ДВС основан на эффекте теплового расширения газов, возникающего при сгорании топливно-воздушной смеси и обеспечивающего перемещение поршня в цилиндре. Работа поршневого ДВС осуществляется циклически. 
    Каждый рабочий цикл происходит за два оборота коленчатого вала и включает четыре такта (четырехтактный двигатель): впуск, сжатие, рабочий ход и выпуск. Во время тактов впуск и рабочий ход происходит движение поршня вниз, а тактов сжатие и выпуск – вверх. Рабочие циклы в каждом из цилиндров двигателя не совпадают по фазе, чем достигается равномерность работы ДВС. 
    В некоторых конструкциях двигателей внутреннего сгорания рабочий цикл реализуется за два такта – сжатие и рабочий ход (двухтактный двигатель). На такте впуск впускная и топливная системы обеспечивают образование топливно-воздушной смеси. В зависимости от конструкции смесь образуется во впускном коллекторе (центральный и распределенный впрыск бензиновых двигателей) или непосредственно в камере сгорания (непосредственный впрыск бензиновых двигателей, впрыск дизельных двигателей). 
    При открытии впускных клапанов газораспределительного механизма воздух или топливно-воздушная смесь за счет разряжения, возникающего при движении поршня вниз, подается в камеру сгорания. На такте сжатия впускные клапаны закрываются, и топливно-воздушная смесь сжимается в цилиндрах двигателя. Такт рабочий ход сопровождается воспламенением топливно-воздушной смеси (принудительное или самовоспламенение). 
    В результате возгорания образуется большое количество газов, которые давят на поршень и заставляют его двигаться вниз. Движение поршня через кривошипно-шатунный механизм преобразуется во вращательное движение коленчатого вала, которое затем используется для движения автомобиля. При такте выпуск открываются выпускные клапаны газораспределительного механизма, и отработавшие газы удаляются из цилиндров в выпускную систему, где производится их очистка, охлаждение и снижение шума. 
    Далее газы поступают в атмосферу. Рассмотренный принцип работы двигателя внутреннего сгорания позволяет понять, почему ДВС имеет небольшой коэффициент полезного действия - порядка 40%. В конкретный момент времени как правило только в одном цилиндре совершается полезная работа, в остальных – обеспечивающие такты: впуск, сжатие, выпуск.';
    
    $splitted = explode("\n", $text); // поделил на абзацы
    
    $itemsPerPage = 2; // кол-во абзацев на странице
    $itemsCount = count($splitted); // общее кол-во абзацев (в моем случае 6)
    $pagesCount = ceil($itemsCount/$itemsPerPage); // определяем кол-во страниц
    if($pagesCount == 0) { //если данные пусты
        $pagesCount = 1; //то одна страница, хоть и пустая, все равно должна быть
    }
    if ($page > $pagesCount) {
        exit('Запрошенная страница не существует');
    }
    
    $firstNumber = ($page - 1) * $itemsPerPage;
    $pageData = array_slice($splitted, $firstNumber, $itemsPerPage);
    
    include 'template/page.php';
    
    echo "<br> <br>";
    
    function paragraphData($string){
        $symbolsCount = mb_strlen($string);
        $words = explode(" ", $string);
        $wordsCount = count($words);
        $sentence1 = ".";
        $sentence2 = "!";
        $sentence3 = "?";
        $sentenceCount = (mb_substr_count($string,$sentence1)) + (mb_substr_count($string, $sentence2)) + (mb_substr_count($string, $sentence3));
        echo "<i> Количество символов - <b> $symbolsCount</b>; </i> ";
        echo "<i> Количество слов - <b> $wordsCount</b>; </i>";
        echo "<i> Количество предложений - <b> $sentenceCount</b>. </i> <br> <br>";
    }
    
    
    function keyWord($str) {
        $keyword = 'ДВС';
        $keywordRed = "<span style = 'color:red'> <b>$keyword</b> </span>";
        $keywordReplacement = str_replace($keyword, $keywordRed, $str);
        return $keywordReplacement;
    }

page.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Постраничный вывод</title>
</head>
<body>
<h1>Страница <?=$page?></h1>
<div>
    <?php
    foreach ($pageData as $item){
        echo "<div>" . keyWord($item) . "</div>" . "<br>";
        paragraphData($item);
    }
    ?>
</div>
        <div>
    <?php
    for ($i = 1; $i <= $pagesCount; $i++){
        if ($i == $page){
            echo "$i";
        } else {
            ?>
    <a href ="index.php?page=<?=$i?>"><?=$i?></a>
    <?php
        }
    }
    ?>
        </div>
    </body>
</html>

Ответы (1 шт):

Автор решения: Anton Mironov

Ответил в другом вашем вопросе. Продублирую здесь, если тот закроют.

Можно сделать с помощью регулярных выражений. Обернём каждую первую букву в предложении в тег <b></b>:

$text = 'Рассмотрим принцип работы двигателя внутреннего сгорания. Принцип работы ДВС основан на эффекте теплового расширения газов, возникающего при сгорании топливно-воздушной смеси и обеспечивающего перемещение поршня в цилиндре. Работа поршневого ДВС осуществляется циклически. Каждый рабочий цикл происходит за два оборота коленчатого вала и включает четыре такта (четырехтактный двигатель): впуск, сжатие, рабочий ход и выпуск.';

$result = preg_replace_callback('/(^|[.]\s*)([А-Я])/u', function($matches){
    return $matches[1]."<b>".$matches[2]."</b>";
}, $text);

Само регулярное выражение:

^ - Начало строки
| - Или
[.] - Проверка что стоит точка. Сюда можно добавить ? или !.
\s* - ноль или больше пробелов
[А-Я] - буквы русского алфавита. Если надо добавить маленькие буквы, то изменить на [А-Яа-я]
u - Модификатор, указывающий на то что используется Юникод

Пример в песочнице

→ Ссылка