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

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

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

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

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

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

这是我迄今为止的解析功能:

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

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

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

    return $text;
}

如果你还可以解释一下正则表达式正在做什么,那将是非常好的。


样式

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

回答

使用这个正则表达式来删除两个标签(这里是表格和行)之间的所有换行符:

([table]([^rn]*))(rn)*([^rn]*[row])

棘手的部分是替换它(另请参阅:preg_replace()仅字符串的特定部分):

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

而不是用''替换,只用'$1$4'替换它的第二个组(rn)* )。

[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] 
链接地址: http://www.djcxy.com/p/29875.html

上一篇: replace all line breaks between specific BBCode tags

下一篇: php regex bbcode returns blank