【问题标题】:Replace double br with paragraphs in PHP with Regex用正则表达式将双 br 替换为 PHP 中的段落
【发布时间】:2015-08-17 21:00:54
【问题描述】:

我有以下文本(来自 SQL 的字符串):

Paragraph \n Newline \n\n Paragraph2 \n\n\n\n Paragraph3

这一行被处理:

function nl2brAndParagraphs($text) {
    $br = nl2br($text);
    $data = preg_replace('/^\s*(?:<br\s*\/?>\s*)*/i', '', $br); //Remove any whitespace and br- tags that are at the beginning of the text
$data = preg_replace('/\s*(?:<br\s*\/?>\s*)*$/i', '', $data); //Remove any whitespace and br- tags that are at the end of the text

$data = preg_replace('#(?:<br\s*/?>\s*?){2,}#','</p>
    <p>',$data); //Replace multiple line breaks with paragraphs
$data = '<p>'.$data.'</p>';
return $data;
}

这应该返回:

<p>Paragraph <br /> Newline </p><p> Paragraph2 </p><p> Paragraph3</p>

但返回

<p>paragraph1 <br /> Newline </p><p> paragraph2 </p><p></p><p> paragraph3</p>

如何修复 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 部分,那里应该只有 &lt;/p&gt;&lt;p&gt;

【问题讨论】:

  • precode 标签从何而来? $data 中返回了什么?
  • @CarstenHagemann 更新了问题。 - 我之前使用错误的方法查看 $data 的内容。现在我知道 pre-tag 问题是由与 nl2brAndParagraphs 一起使用时的降价引起的。 nl2brAndParagraphs 在第 2 和第 3 段之间仍然返回太多的段落标签
  • 你应该打开一个关于降价过滤器的新问题。

标签: php regex nl2br


【解决方案1】:

这将多个连续的段落标签合并为一个:

$data = preg_replace('# (\s*<\/p>\s*<p>){2,}#',' <\/p><p>',$data); 

Demo

【讨论】:

  • 这似乎在 regex101 上进行演示,但在我的页面上运行它时会导致 Warning: preg_replace(): Unknown modifier '{'
  • 似乎对我不起作用(这里是正则表达式新手,抱歉)。 $data = preg_replace('# (\s*&lt;\/p&gt;\s*&lt;p&gt;){2,}#',' &lt;\/p&gt;&lt;p&gt;',$data); 似乎不会影响字符串。 -$data 仍然是 &lt;p&gt;paragraf&lt;br /&gt; br&lt;/p&gt; &lt;p&gt; paragraf2&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; paragraf3&lt;/p&gt; 尝试过 # (\s*\s*

    ){2,}#gbut that produces a warning: 未知修饰符 'g'` 还尝试将 # 替换为 /

【解决方案2】:

这会删除所有空段落:

$data = preg_replace('/<p[^>]*>\s*?<\/p[^>]*>/', '', $data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多