【问题标题】:preg_replace all line breaks between specific BBCode tagspreg_replace 特定 BBCode 标记之间的所有换行符
【发布时间】:2014-03-08 10:30:36
【问题描述】:

我正在使用类似 BBCode 的编辑语法编写一个 wiki。
我希望允许用户输入解析为<br> 标签的换行符。
到这里为止没有问题发生。

现在我还有以下几行,应该转换成表格:

[table]
    [row]
        [col]Column1[/col]
        [col]Column2[/col]
        [col]Column3[/col]
    [/row]
[/table]

在格式化上面的可编辑 BBCode 时输入的所有这些换行符正在创建 <br> 标记,这些标记被强制呈现在 html 表的前面。

我的目标是使用 php 的 preg_replace 在我的解析器函数中删除 [table][/table] 之间的所有换行符,而不会破坏使用换行符输入普通文本的可能性。

这是我目前的解析函数:

function richtext($text)
{
    $text = htmlspecialchars($text);

    $expressions = array(
        # Poor attempts
        '/\[table\](\r\n*)|(\r*)|(\n*)\[\/table\]/' => '',
        '/\[table\]([^\n]*?\n+?)+?\[\/table\]/' => '',
        '/\[table\].*?(\r+).*?\[\/table\]/' => '',
        # Line breaks
        '/\r\n|\r|\n/' => '<br>'
    );

    foreach ($expressions as $pattern => $replacement)
    {
        $text = preg_replace($pattern, $replacement, $text);
    }

    return $text;
}

如果你也能解释一下正则表达式在做什么,那就太好了。

【问题讨论】:

  • 嗯,你到底想在这里做什么?只是删除多余的空格? [\n\r\t]+|\s{2,} => ''
  • 哦,你的意思是可以输入[col]Colu \n mn1[/col]之类的东西?
  • 不,实际上我想删除[table][/table]标签内的所有\r\n\r\n,所以'/\r\n|\r|\n/' =&gt; '&lt;br&gt;'这一行不会回显解析后的&lt;br&gt;标签html&lt;table&gt;&lt;/table&gt;

标签: php regex preg-replace newline bbcode


【解决方案1】:

风格

首先,您不需要foreach 循环,preg_replace 接受混合变量,例如数组,请参见示例 #2:http://www.php.net/manual/en/function.preg-replace.php

回答

使用此正则表达式删除两个标签(此处为表格和行)之间的所有换行符:

(\[table\]([^\r\n]*))(\r\n)*([^\r\n]*\[row\])

棘手的部分是替换它(另见:preg_replace() Only Specific Part Of String):

$result = preg_replace('/(\[table\][^\r\n]*)(\r\n)*([^\r\n]*\[row\])/', '$1$4', $subject);

不要用'' 替换,而是用'$1$4' 仅替换第二组((\r\n)*)。

示例

[table] // This will also work with multiple line breaks
    [row]
        [col]Column1[/col]
        [col]Column2[/col]
        [col]Column3[/col]
    [/row]
[/table]

使用正则表达式,这将输出:

[table]    [row]
        [col]Column1[/col]
        [col]Column2[/col]
        [col]Column3[/col]
    [/row]
[/table] 

【讨论】:

  • 更新了我的答案,现在[table] aaa [row] 也会匹配
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2017-04-13
  • 2012-08-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多