【问题标题】:Regex/preg_replace to remove extra line breaks between [font#ABCDEF]$text[/font] BBcodeRegex/preg_replace 删除 [font#ABCDEF]$text[/font] BBcode 之间的额外换行符
【发布时间】:2015-05-14 23:30:25
【问题描述】:

有一个博客,用户可以在其中发布他们的消息。他们可以使用字体 BB 代码。问题 - 在此字体 BB 代码之间发布文本时,当前脚本不会删除多个换行符(它适用于明文)。

所以我的想法是添加一个 preg_replace 函数,以便从字体 BB 代码中发布的文本中删除多余的行。字体 BB 代码以:[font#ABCDEF] 开头,以 [/font] 结尾。

例如:

[font#FF0000]



This text is in red.

Hello world. How are you?






Good, thanks.


[/font]

在 preg_replace 之后最多应该留下 2 个换行符(例如,如果有人添加了 6 个换行符,则应该减少到 2 个;如果有人添加了 1 或 2 个换行符,则应该在输入时留下,即. 1 或 2) 等。

这是我目前的尝试,但它似乎没有工作,即使它应该关闭正确的解决方案,我希望:

$text=preg_replace("#(\[font[^\]]*?\])[\r\n ]+#i", "\\1", $text);
$text=preg_replace("#[\r\n ]+(\[/font\])#i", "\\1", $text);
$text=preg_replace("#(\[/font\])[\r\n]{2,}#i","\\1\n", $text);

(理想情况下最好不要在开始 [font#ABCDEF] 标记之后和结束 [/font] 标记之前留下任何换行符,因为那里不需要换行符完全没有。

【问题讨论】:

  • #\R+# 匹配任何换行符序列一次或多次

标签: php regex


【解决方案1】:

您可以使用这种使用\G 锚点的模式。这个anchor匹配上一次匹配后的位置,所以获取连续结果很有用:

$pattern = '~
(?:
    \G(?!\A)      # position after the last match
  |              # or
    \[font[^]]*]  # start tag
     (?: \K \R+ (*ACCEPT) )? # if leading newlines,
                             # (*ACCEPT) forces the pattern to succeed immediatly
)
(?> [^\r\n[]* \K \R )*? # lines until:
# (\K removes all on the left from the match result)
(?:
    \R+(?=\[/font]) # the end 
  |                # or
    \R \K \R+       # more than two newlines
)
~xi';

$txt = preg_replace($pattern, '', $txt);

preg_replace_callback还有另一种方式:模式查找字体标签之间的内容,回调函数删除不需要的换行符:

$txt = preg_replace_callback('~\[font[^]]*]\K[^[]+(?=\[/font])~i', function ($m) {
    return preg_replace('~\R\R\K\R+~', '', trim($m[0], "\r\n"));
}, $txt);

【讨论】:

    【解决方案2】:

    这会将 3 个或更多换行符转换为 2 个:

    $text=preg_replace("/(\r|\n){3,}/", "\n\n", $text);
    

    这将直接删除 [font] 标记后的所有空格:

    $text=preg_replace("/(\[font#.{6}\])(\s)*/", "$1", $text);
    

    在这里试试:http://sandbox.onlinephpfunctions.com/code/435951e8dd1039ce8da41d64c501f4bf46c79cc6

    【讨论】:

    • 那么上面这两行代码应该是用来达到目的的吧?
    • @NonCoder 是的,他们应该按照您在问题中概述的方式进行操作。我又犯了一个愚蠢的错误,但我现在改正了。查看更新的答案和链接。
    • 它工作得几乎完美 - 唯一的问题是它似乎在结束之前留下一个换行符 [/font] - 是否有可能在之前没有任何换行符 [/字体]? - 见:sandbox.onlinephpfunctions.com/code/…
    猜你喜欢
    • 2014-03-08
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2011-11-13
    • 2021-12-21
    相关资源
    最近更新 更多