Новая строка для функции абзаца

У меня есть эта интересная функция, которую я использую для создания новых строк в параграфах. Я использую его вместо функции 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>'; 

}

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

Любая помощь, которую вы можете предложить, очень ценится.

Проблема заключается в вашем матче за разрывы в одной строке. Он соответствует последнему символу перед разрывом строки и первым после. Затем вы заменяете матч с помощью, чтобы вы потеряли эти символы. Вам нужно держать их в замене.

Попробуй это:

 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>", '$1<br'.($xml == true ? ' /' : '').'>$2'), 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>", '$1<br'.($xml == true ? ' /' : '').'>$2'), trim($string)).'</p>'; } 

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

 function nl2p($string) { $paragraphs = ''; foreach (explode("\n", $string) as $line) { if (trim($line)) { $paragraphs .= '<p>' . $line . '</p>'; } } return $paragraphs; } 

Если вам нужно сделать это только один раз в своем приложении и не хотите создавать функцию, ее можно легко сделать inline:

 <?php foreach (explode("\n", $string) as $line): ?> <?php if (trim($line)): ?> <p><?=$line?></p> <?php endif ?> <?php endforeach ?> 

Вот подход, который приходит с обратным методом, чтобы заменить абзацы назад на регулярные разрывы строк и наоборот.

Они полезны при создании ввода формы. При сохранении ввода пользователя вы можете конвертировать разрывы строк в теги абзацев, однако при редактировании текста в форме вам может не понадобиться видеть какие-либо символы 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; } 

Я также написал очень простую версию:

 function nl2p($text) { return '<p>'.str_replace(array("\r\n", "\r", "\n"), '</p><p>', $text).'</p>'; } 

Просто введите это между вашими линиями:

 echo '<br>'; 

Это даст вам новую строку.