New line to paragraph function

前端 未结 7 1048
情话喂你
情话喂你 2021-01-31 09:20

I have this interesting function that I\'m using to create new lines into paragraphs. I\'m using it instead of the nl2br() function, as it outputs better formatted

相关标签:
7条回答
  • 2021-01-31 09:33

    Here's an approach that comes with a reverse method to replace paragraphs back to regular line breaks and vice versa.

    These are useful to use when building a form input. When saving a users input you may want to convert line breaks to paragraph tags, however when editing the text in a form, you may not want the user to see any html characters. Then we would replace the paragraphs back to line breaks.

    // 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;
    }
    
    0 讨论(0)
  • 2021-01-31 09:39

    The problem is with your match for single line breaks. It matches the last character before the line break and the first after. Then you replace the match with <br>, so you lose those characters as well. You need to keep them in the replacement.

    Try this:

    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>'; 
    }
    
    0 讨论(0)
  • 2021-01-31 09:45

    @Laurent's answer wasn't working for me - the else statement was doing what the $line_breaks == true statement should have been doing, and it was making multiple line breaks into <br> tags, which PHP's native nl2br() already does.

    Here's what I managed to get working with the expected behavior:

    function nl2p( $string, $line_breaks = true, $xml = true ) {
    
        // Remove current tags to avoid double-wrapping.
        $string = str_replace( array( '<p>', '</p>', '<br>', '<br />' ), '', $string );
    
        // Default: Use <br> for single line breaks, <p> for multiple line breaks.
        if ( $line_breaks == true ) {
            $string = '<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>';
    
        // Use <p> for all line breaks if $line_breaks is set to false.
        } else {
            $string = '<p>' . preg_replace(
                array( "/([\n]{1,})/i", "/([\r]{1,})/i" ),
                "</p>\n<p>",
                trim( $string ) ) . '</p>';
        }
    
        // Remove empty paragraph tags.
        $string = str_replace( '<p></p>', '', $string );
    
        // Return string.
        return $string;
    
    }
    
    0 讨论(0)
  • 2021-01-31 09:46

    I also wrote a very simple version:

    function nl2p($text)
    {
        return '<p>'.str_replace(array("\r\n", "\r", "\n"), '</p><p>', $text).'</p>';
    }
    
    0 讨论(0)
  • 2021-01-31 09:51

    Expanding upon @NaturalBornCamper's solution:

    function nl2p( $text, $class = '' ) {
        $string = str_replace( array( "\r\n\r\n", "\n\n" ), '</p><p>', $text);
        $string = str_replace( array( "\r\n", "\n" ), '<br />', $string);
        return '<p' . ( $class ? ' class="' . $class . '"' : '' ) . '>' . $string . '</p>';
    }
    

    This takes care of both double line breaks by converting them to paragraphs, and single line breaks by converting them to <br />

    0 讨论(0)
  • 2021-01-31 09:51

    Just type this between your lines:

    echo '<br>';
    

    This will give you a new line.

    0 讨论(0)
提交回复
热议问题