我正在用类似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;
}
如果您还能解释一下正则表达式正在做什么,那将会很棒。
答案 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]