У меня есть эта интересная функция, которую я использую для создания новых строк в абзацы. Я использую его вместо функции NL2BR ()
, как Выводит лучший отформатированный текст.
function nl2p($string, $line_breaks = true, $xml = true) {
$string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '', $string);
// It is conceivable that people might still want single line-breaks
// without breaking into a new paragraph.
if ($line_breaks == true)
return '<p>'.preg_replace(array("/([\n]{2,})/i", "/([^>])\n([^<])/i"), array("</p>\n<p>", '<br'.($xml == true ? ' /' : '').'>'), trim($string)).'</p>';
else
return '<p>'.preg_replace(
array("/([\n]{2,})/i", "/([\r\n]{3,})/i","/([^>])\n([^<])/i"),
array("</p>\n<p>", "</p>\n<p>", '<br'.($xml == true ? ' /' : '').'>'),
trim($string)).'</p>';
}
Проблема в том, что всякий раз, когда я пытаюсь создать один разрыв строки, он непреднамеренно удаляет первый символ абзаца под ним. Я недостаточно знакомого с Regex, чтобы понять, что вызывает проблему.
Вот подход, который идет с обратным методом, чтобы заменить абзацы на обычные разрывы строк и наоборот.
Это полезно использовать при построении ввода формы. При сохранении пользовательского ввода может потребоваться преобразовать разрывы строк в теги абзаца, однако при редактировании текста в форме вы можете не захотеть, чтобы пользователь видел какие-либо HTML-символы. Затем мы заменили бы абзацы на разрывы строк.
// This function will convert newlines to HTML paragraphs
// without paying attention to HTML tags. Feed it a raw string and it will
// simply return that string sectioned into HTML paragraphs
function nl2p($str) {
$arr=explode("\n",$str);
$out='';
for($i=0;$i<count($arr);$i++) {
if(strlen(trim($arr[$i]))>0)
$out.='<p>'.trim($arr[$i]).'</p>';
}
return $out;
}
// Return paragraph tags back to line breaks
function p2nl($str)
{
$str = preg_replace("/<p[^>]*?>/", "", $str);
$str = str_replace("</p>", "\r\n", $str);
return $str;
}