Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.08.2021
Сообщений: 1

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

19.08.2021, 00:08. Показов 930. Ответов 4
Метки php (Все метки)

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

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

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

index.php

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$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

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!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>
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2021, 00:08
Ответы с готовыми решениями:

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

Задание: выделить первое предложение каждого абзаца жирным шрифтом
Здравствуйте! Помогите пожалуйста. Задание: выделить первое предложение каждого абзаца жирным шрифтом. Вот я написала Sub P() Dim...

Дан текст. Переставить в нем первую букву первого предложения и первую букву второго предложения. (Сначала найти номер п
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;string&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;RUS&quot;); ...

4
Невнимательный
 Аватар для ft4l
2840 / 1266 / 358
Регистрация: 08.02.2013
Сообщений: 7,359
Записей в блоге: 2
19.08.2021, 09:19
Цитата Сообщение от officer Pulaski Посмотреть сообщение
первые недели занятия
я-бы скаазал заданиие так на уже после основательного изучения
... Сама идея того, что параграфы каждый в своей строке, как-бы не очень
С разделителем каким-нибудь, хотя-бы пустая строка, было-бы заметно удобнее.
... Хранение текста в самом файле тоже, как мне кажется, это не то.
Если текста не твк много , то и можно просто вывести всё разом, и каким-нибудь сss, вроде даже можно,
сделать переключалку по частям текста.
Постранично имеет смысл выводить когда файл может быть большим, и будет нежелательно его полностью грузить в память.

Я-бы даже хранил сам текст в одном файле, а числа дл навигации о нему в другом, помельче.
Попробовал набросать так корявенько...
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
error_reporting(-1);
ini_set('display_errors', 1);
header('content-type: text/html; charset=utf-8');
 
$file = './f/test.txt';#            файл с текстом
$ind_file = './f/test_index.txt';#  файл с позициями
$PERPAGE = 4; # параграфов на странице
 
if (!is_file($ind_file) && isset($_GET['install']))
{
    function toUTF($txt) {
        global $fh;
        fwrite($fh, strtr(iconv('cp1251','utf-8', $txt), ["\r"=>""]));
    }
    if(!($fh = fopen($file, 'c+')) || !flock($fh, LOCK_EX))
        exit("Unable open file '$file'");
    ftruncate($fh, 0);
    ob_start('toUTF' , 256);
    readfile('http://lib.ru/INPROZ/SWIFT_G/r_swift2.txt_Ascii.txt');
    ob_flush();
    ob_end_clean();
    flock($fh, LOCK_UN);
    fseek($fh, 0); // на начало файла
    $paragrafs = [];
    $header = trim(fgets($fh), "\n\x14\x15 ") .'|||';# название
    while(($s = fgets($fh)) == "\n"); # пропуск пустых строк
    while(($s = fgets($fh)) != "\n"){# описание
        $header .= trim($s) .'\n';
    }
    while(($s = fgets($fh)) == "\n");# пропуск пустых строк
    #___ подсчёт парагррафов _____
    $paragrafs[] = $header."\n";
    $pos = ftell($fh);
    $s = fgets($fh);
    do {
        if (preg_match('#:\s*$#', $s)) { #прямая речь
            fgets($fh);
            continue;
        }
        while (preg_match('#^\h*-#', $s)) $s = fgets($fh);      
        $paragrafs[] = $pos .';'. ($pos = ftell($fh))."\n";
    } while ($s = fgets($fh));
    //var_export($paragrafs);
    fclose($fh);
    echo '<dd>Readed.</dd>';
    file_put_contents ($ind_file, $paragrafs, LOCK_EX);
    echo '<dd>Writed.</dd>';
    echo '<dd><a href="?">Back</a></dd>';
    exit;
}
if (!is_file($ind_file)) {
    exit('<dd> Надо <a href="?install">скачать и установить</a> файл с текстом.</dd>');
}
 
$parfs = file($ind_file, FILE_IGNORE_NEW_LINES + FILE_SKIP_EMPTY_LINES );
list($TITLE, $DESC) = explode('|||', array_shift($parfs));
$DESC = strtr($DESC,['\n'=>"\n"]);
$PG_MAX = ceil(count($parfs)/$PERPAGE) -1;
$PG = isset($_GET['pg'])? abs(intval($_GET['pg'])): 0;
if ($PG_MAX < $PG) $PG = $PG_MAX; #     последняя страница
 
$parfs = array_slice($parfs, $PG*$PERPAGE, $PERPAGE);
$pos = intval($parfs[0]); #     позиция первого параграфа
array_walk($parfs, function(&$v){ $tmp = explode(';',$v); $v =  $tmp[1]-$tmp[0]; });# размеры строк
 
function high($m){
        if (count($m)==3) return $m[0];
        return '<span class="'. (count($m)==1? 'green':'blue') .'">'. "{$m[0]}</span>";
}
function keyWord($txt, $word, &$wordcount, &$count){
    $txt = preg_replace_callback("#\b$word\b|\b(?=\w*$word)\w+\b()|\b\w+\b()#ui",
                            'high', $txt, -1, $wordcount);
    return preg_replace('#\b\w|(?><[^>]*+>|(?<=\w)[^.!?;:]*+[\s"]*+)(*SKIP)(?!)#u',
                    '<b class="red">'."\$0</b>",$txt,-1,$count);
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title><?= 1+$PG ?> Постраничный вывод</title>
    <style>
    p{ text-indent:1.5em; white-space:pre-wrap;}
    h1,h3   {text-align:center;}
    .red    {color:#700; background:#FBB;}
    .green  {color:#070; background:#BFB;}
    .blue   {color:#007; background:#BBF;}
    </style>
</head>
<body>
<h1><?= $TITLE ?></h1>
<h2><?= $DESC ?></h1>
<h3>Страница <?= 1+$PG ?></h1>
<div>
    <?php
    
    $fp = fopen($file, 'r');
    fseek($fp, $pos);
    $cnts = [];
    foreach ($parfs AS $len) {
        $wordcount = $count = 0;
        $str = fread($fp, $len);
        echo "<p>" . keyWord($str, 'дед', $wordcount, $count) . "</p>\n";
        $cnts[] = [$wordcount, $count];
    }
    ?>
</div>
<dl><dt><b>подсчёт</b></dt>
    <?php
    foreach ($cnts AS $k=>$v) {
        echo "<dd>блок:$k, слов:{$v[0]}, предложений:{$v[1]}.</dd>\n";
    }
    ?>
</dl>
<div>
    <?php
    for ($i = 0; $i <= $PG_MAX; ){
        if ($i == $PG){
            echo '<b>', ++$i. "</b>\n";
            continue;
        }
        echo '<a href="?'.($i? "pg=$i":'').'">', ++$i, "</a>\n";
    }
    ?>
</div>
    </body>
</html>
Слишком сложно разбивать на параграфы... так-как в этом случайном тексте куча диалогов, где в каждой по пару слов с минусом в начале.
+бывает вообще случайные слова переносятся, это даже не пытался фиксить... файл с текстом трогать не хотелось.

Ещё сложность выделить сначала одно, потом выделить ещё другое не задевая разметку первого выделения...
Наверно перемудрил с выражением... но оно так-же считать должно предложения.
А несоторые предложения внутри предложений ))
А мать сказала: "Скоро мы переедем в новый дом - Ральф собирается купить его".
Вобщем если Вам для учёбы... то Вы не сможете объяснить такой (плохоеСлово)-код.
Сам не смогу,) и делать из этого код получшее как-бы особо некуда,) сжато максимально.

Не по теме:


Работает(как-бы частично) только с одним этим файлом с того сайта... а там таких много и форматирование отличается,
еле нашёл файл, где побольше всего построчно, поменьше заголовков



Добавлено через 16 минут
поглядел мне в глаза - так же, как когда-то давно
когда-то считает как два слова И места с многоточиями... двоеточиями
Как типа такого ... наверно считаются как разделители предложений

Добавлено через 6 минут
Цитата Сообщение от x_lab Посмотреть сообщение
с многоточиями... двоеточиями
Например так можно уменьшить число таких предложений
'#\b\p{Lu}|(?><[^>]*+>|(?<=\w)[^.!?;:]*+[\s"]*+)(*SKIP)(?!)#u'
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
19.08.2021, 09:34
officer Pulaski, нужен совсем чистый текст, чтобы казусы исключить. А так, примерно вот так можно сделать:
PHP
1
2
3
4
5
6
7
$text = 'Рассмотрим принцип работы двигателя внутреннего сгорания. Принцип работы ДВС основан на эффекте теплового расширения газов, возникающего при сгорании топливно-воздушной смеси и обеспечивающего перемещение поршня в цилиндре. Работа поршневого ДВС осуществляется циклически? 
    Каждый рабочий цикл происходит за два оборота коленчатого вала и включает четыре такта (четырехтактный двигатель): впуск, сжатие, рабочий ход и выпуск. Во время тактов впуск и рабочий ход происходит движение поршня вниз, а тактов сжатие и выпуск – вверх. Рабочие циклы в каждом из цилиндров двигателя не совпадают по фазе, чем достигается равномерность работы ДВС. В некоторых конструкциях двигателей внутреннего сгорания рабочий цикл реализуется за два такта – сжатие и рабочий ход (двухтактный двигатель). На такте впуск впускная и топливная системы обеспечивают образование топливно-воздушной смеси. В зависимости от конструкции смесь образуется во впускном коллекторе (центральный и распределенный впрыск бензиновых двигателей) или непосредственно в камере сгорания (непосредственный впрыск бензиновых двигателей, впрыск дизельных двигателей)! 
    При открытии впускных клапанов газораспределительного механизма воздух или топливно-воздушная смесь за счет разряжения, возникающего при движении поршня вниз, подается в камеру сгорания. На такте сжатия впускные клапаны закрываются, и топливно-воздушная смесь сжимается в цилиндрах двигателя. Такт рабочий ход сопровождается воспламенением топливно-воздушной смеси (принудительное или самовоспламенение). 
    В результате возгорания образуется большое количество газов, которые давят на поршень и заставляют его двигаться вниз. Движение поршня через кривошипно-шатунный механизм преобразуется во вращательное движение коленчатого вала, которое затем используется для движения автомобиля. При такте выпуск открываются выпускные клапаны газораспределительного механизма, и отработавшие газы удаляются из цилиндров в выпускную систему, где производится их очистка, охлаждение и снижение шума. 
    Далее газы поступают в атмосферу. Рассмотренный принцип работы двигателя внутреннего сгорания позволяет понять, почему ДВС имеет небольшой коэффициент полезного действия - порядка 40%. В конкретный момент времени как правило только в одном цилиндре совершается полезная работа, в остальных – обеспечивающие такты: впуск, сжатие, выпуск.';
$pattern = '/([?!.]){0,}( )([А-Я])/u';
$text = preg_replace($pattern, '$1$2<b>$3</b>', $text);
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
19.08.2021, 09:41
atanov, {0,} - почему бы не использовать необязательный квантификатор * ?
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
19.08.2021, 09:44
Строитель, да можно конечно, просто по привычке написал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.08.2021, 09:44
Помогаю со студенческими работами здесь

Выделить категорию жирным шрифтом
как сделать глав категорию жирным, и шрифты менять к примеру параметры font-size: 1.4em; color: #000;

Выделить строку в ListView жирным шрифтом
Здравствуйте!Возможно ли выделить строку в ListView жирным шрифтом. Вот код кнопки которая заполняет listView: private void...

Как выделить вывод переменной жирным шрифтом ?
А как сделать вывод переменной жирным шрифтом ? А то я пишу так, а оно так не работает. function myFunction() { var a, b, c, d; ...

Как выделить строку в RichEdit жирным шрифтом
Здравствуйте. Как оптимальнее всего написать на Делфи следующее: RichEdit.Lines становится жирной и зелёной RichEdit.Lines...

Lisp Прога удаляет первую букву каждого слова из предложения.
Создать прогу, которая удаляет первую букву каждого слова из предложения.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru