替换特定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