选择语言 :

 Core_Text::auto_p

Automatically applies "p" and "br" markup to text. Basically nl2br on steroids.

echo Text::auto_p($text);

This method is not foolproof since it uses regex to parse HTML.
string Core_Text::auto_p( string $str [, boolean $br = bool true ] )

参数列表

参数 类型 描述 默认值
$str string Subject
$br boolean Convert single linebreaks to
bool true
返回值
  • string
File: ./core/classes/text.class.php
public static function auto_p($str, $br = TRUE)
{
    // Trim whitespace
    if ( ($str = trim($str)) === '' ) return '';

    // Standardize newlines
    $str = str_replace(array("\r\n", "\r"), "\n", $str);

    // Trim whitespace on each line
    $str = preg_replace('~^[ \t]+~m', '', $str);
    $str = preg_replace('~[ \t]+$~m', '', $str);

    // The following regexes only need to be executed if the string contains html
    if ( $html_found = (strpos($str, '<') !== FALSE) )
    {
        // Elements that should not be surrounded by p tags
        $no_p = '(?:p|div|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))';

        // Put at least two linebreaks before and after $no_p elements
        $str = preg_replace('~^<' . $no_p . '[^>]*+>~im', "\n$0", $str);
        $str = preg_replace('~</' . $no_p . '\s*+>$~im', "$0\n", $str);
    }

    // Do the <p> magic!
    $str = '<p>' . trim($str) . '</p>';
    $str = preg_replace('~\n{2,}~', "</p>\n\n<p>", $str);

    // The following regexes only need to be executed if the string contains html
    if ( $html_found !== FALSE )
    {
        // Remove p tags around $no_p elements
        $str = preg_replace('~<p>(?=</?' . $no_p . '[^>]*+>)~i', '', $str);
        $str = preg_replace('~(</?' . $no_p . '[^>]*+>)</p>~i', '$1', $str);
    }

    // Convert single linebreaks to <br />
    if ( $br === TRUE )
    {
        $str = preg_replace('~(?<!\n)\n(?!\n)~', "<br />\n", $str);
    }

    return $str;
}