段落功能的新行

Jer*_*emy 27 php regex

我有这个有趣的功能,我用它来创建段落中的新行.我正在使用它而不是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>'; 
Run Code Online (Sandbox Code Playgroud)

}

问题是每当我尝试创建一个换行符时,它会无意中删除它下面段落的第一个字符.我对正则表达式不太熟悉,无法理解造成问题的原因.

非常感谢您提供的任何帮助.

Lau*_*tin 43

问题在于您对单线换行的匹配.它匹配换行符之前的最后一个字符和后面的第一个字符.然后你用匹配替换匹配<br>,所以你也丢失了这些字符.您需要将它们保留在替换中.

试试这个:

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>'; 
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 41

这是另一种不使用正则表达式的方法.注意,此函数将删除任何单个换行符.

function nl2p($string)
{
    $paragraphs = '';

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

    return $paragraphs;
}
Run Code Online (Sandbox Code Playgroud)

如果您只需要在应用程序中执行此操作一次并且不想创建函数,则可以轻松地内联完成:

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

  • 这是更好更快的解决方案. (2认同)
  • @Jonathan我今天读了这个解决方案,我认为这是最好的答案.我建议用PHP_EOL替换"\n",它总是返回正确的行尾符号. (2认同)

Nat*_*per 5

我还写了一个非常简单的版本:

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