Как преобразовать текст из textarea в параграфы HTML

Такой вопрос возникает при вставке текста из формы на сайт (отзывы, комментарии и т.д.) с форматированием элементом <p>. У данного вопроса есть два варианта решения:

Самое простое – разделить текст по переносам строк \r\n:

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Proin blandit magna eu tempus ullamcorper?
Sed porta justo sed nibh elementum condimentum. 
Quisque non eros sit amet elit commodo maximus eget a eros!';

$html = array();
foreach (explode(PHP_EOL, $text) as $row) {
	$html[] = '<p>' . trim($row) . '</p>';
}

echo implode(PHP_EOL, $html);
PHP

Результат:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Proin blandit magna eu tempus ullamcorper?</p>
<p>Sed porta justo sed nibh elementum condimentum.</p>
<p>Quisque non eros sit amet elit commodo maximus eget a eros!</p>

Или более краткий вариант, но без форматирования HTML-кода:

echo '<p>' . str_replace("\n", '</p><p>', $text) . '</p>';
PHP

Результат:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p><p>Proin blandit magna eu tempus ullamcorper?</p><p>Sed porta justo sed nibh elementum condimentum. </p><p>Quisque non eros sit amet elit commodo maximus eget a eros!</p>

Первый пример в действии:

Для форматирования текста из textarea по предложениям, разделёнными знакам препинания (.!?), нужно удалить переносы строк и двойные пробелы, далее с помощью регулярного выражения получить массив предложений и вывести его.

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Proin blandit magna eu tempus ullamcorper? Sed porta justo sed 
nibh elementum condimentum. Quisque non eros sit amet elit 
commodo maximus eget a eros!';

$html = array();
$text = str_replace(array("\r", "\n"), ' ', $text);
$text = preg_replace('/[ ]+/', ' ', $text);
preg_match_all("/.*?[.?!](?:\s|$)/s", $text, $items);
if (!empty($items[0])) {
   	foreach ($items[0] as $item) {
		$html[] = '<p>' . trim($item) . '</p>';
	}
} else {
	$html[] = '<p>' . $text . '</p>';
}
	
echo implode(PHP_EOL, $html);
PHP

Результат:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p>Proin blandit magna eu tempus ullamcorper?</p>
<p>Sed porta justo sed nibh elementum condimentum.</p>
<p>Quisque non eros sit amet elit commodo maximus eget a eros!</p>

Пример в действии:

Ещё пример кода, который сделает по два предложения в одном параграфе:

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Proin blandit magna eu tempus ullamcorper? Sed porta justo sed 
nibh elementum condimentum. Quisque non eros sit amet elit 
commodo maximus eget a eros!';

$html = array();
$text = str_replace(array("\r", "\n"), ' ', $text);
$text = preg_replace('/[ ]+/', ' ', $text);
preg_match_all("/.*?[.?!](?:\s|$)/s", $text, $items);
if (!empty($items[0])) {
   	foreach ($items[0] as $item) {
		$html[] = trim($item);
	}
} else {
	$html[] = $text;
}

$out = array();
foreach(array_chunk($html, 2) as $rows) {
	$out[] = '<p>' . implode(' ', $rows) . '</p>';
}

echo implode(PHP_EOL, $out);
PHP

Результат:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin blandit magna eu tempus ullamcorper?</p>
<p>Sed porta justo sed nibh elementum condimentum. Quisque non eros sit amet elit commodo maximus eget a eros!</p>

Пример:

02.02.2021, обновлено 04.12.2021
3277

Комментарии

, чтобы добавить комментарий.

Другие публикации

Автовысота textarea
Автоизменение высоты textarea можно сделать следующим способом...
5672
+1
Получить выделенный текст из текстового поля
У текстовых полей (textarea, input text и т.д.) есть JS-свойства selectionStart и selectionEnd, которые возвращают...
3664
+2
Contenteditable – текстовый редактор
Если добавить атрибут contenteditable к элементу, его содержимое становится доступно для редактирования пользователю, а...
22067
+25
Изменение размеров textarea и других элементов
В CSS 3 появилось свойство resize, которе указывает, можно ли пользователю изменять размеры текстового поля и других...
8129
0
Обернуть выделенный текст тегами в textarea
С помощью JS-свойств selectionStart и selectionEnd можно сделать оборачивание выделенного текста тегами или BB-кодами.
3489
+5
Как загрузить содержимое файла в textarea
Во всех современных браузерах имеется поддержка JS-объекта FileReader. С помощью него можно асинхронно прочитать...
2457
0