Такой вопрос возникает при вставке текста из формы на сайт (отзывы, комментарии и т.д.) с форматированием элементом <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);
Результат:
<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-кода:
Результат:
<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);
Результат:
<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);
Результат:
<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>