preg_replace特定BBCode标记之间的所有换行符

时间:2014-02-10 21:26:36

标签: php regex preg-replace newline bbcode

我正在用类似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;
}

如果您还能解释一下正则表达式正在做什么,那将会很棒。

1 个答案:

答案 0 :(得分: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);

您只需将第二个组('')替换为(\r\n)*,而不是替换为'$1$4'

实施例

[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]