我有一个很有趣的函数,我用它来创建新的段落。我使用它而不是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>';
}
问题是,每当我试图创建一个换行符时,它会无意中删除它下面段落的第一个字符。我对正则表达式不够熟悉,无法理解是什么导致了这个问题。
8条答案
按热度按时间fxnxkyjh1#
下面是另一种不使用正则表达式的方法。请注意,此函数将删除任何单个换行符。
如果您只需要在应用中执行一次此操作,并且不想创建函数,则可以轻松地内联完成:
kulphzqa2#
问题是你的比赛单行休息。它匹配换行符之前的最后一个字符和之后的第一个字符。然后将匹配替换为
<br>
,这样也会丢失这些字符。你需要把它们放在替换物里。试试这个:
x6h2sr283#
我也写了一个简单的版本:
krcsximq4#
@Laurent的答案对我来说不起作用-
else
语句做的是$line_breaks == true
语句应该做的事情,它在<br>
标记中做了多个换行符,PHP的原生nl2br()
已经做了。下面是我设法使用预期行为得到的结果:
toe950275#
这里有一种方法,它带有一个反向方法,可以将段落替换回常规的换行符,反之亦然。
这些在构建表单输入时很有用。当保存用户输入时,您可能希望将换行符转换为段落标记,但是当编辑表单中的文本时,您可能不希望用户看到任何html字符。然后我们将替换段落回到换行符。
ecbunoof6#
扩展@NaturalBornCamper的解决方案:
这将通过将双换行符转换为段落来处理双换行符,并通过将单行符转换为
<br />
来处理单行符pcrecxhr7#
我用close替换双换行符,然后打开新段落
</p><p>
。剩余的单个换行符转换为<br>
标记。如果你有混合的HTML和非HTML内容,你可以在渲染时检查是否存在p标签:
c9qzyr3d8#
只要在你的行之间输入这个:
这将给予你一个新的路线。