假设我有一个Markdown字符串:
* Bullet has *bold [code]*test[/code] part*. *Another\nbold* item.
我想将它转换为BBCode,如:
* Bullet has [b]bold [code]*test[/code] part[/b]. [b]Another\nbold[/b] item.
...而且,正如您上面所说,保留[code]中的内容。我该如何做到这一点?
背景
看,我正在尝试调整FluxBB论坛。它默认允许BBCode。但是,我还想允许一小部分Markdown用于新手,例如粗体和斜体。至少对于粗体来说,这可以通过如下声明来实现:
$out = preg_replace('/\*(\S.*?\S)\*/s','[b]$1[/b]',$in);
...但是*test
部分存在问题,它也想要翻译它。
答案 0 :(得分:2)
以下代码似乎有效。我使用preg_replace_callback()
和bin2hex()
保留,然后通过pack()
通过另一个preg_replace_callback()
取消保留。
$a = "* Bullet\n* Bullet has *bold [code]*test[/code] part*. *Another\nbold* item.";
echo $a;
echo "\n";
// PRESERVE CODE BLOCK
$a = preg_replace_callback('/\[code\](.*?)\[\/code\]/s',create_function('$a','return "[code]" . bin2hex($a[1]) . "[/code]";'),$a);
// HANDLE MARKDOWN FOR BOLD
$a = preg_replace('/\*(\S.*?\S)\*/s','[b]$1[/b]',$a);
// RESTORE CODE BLOCK
$a = preg_replace_callback('/\[code\](.*?)\[\/code\]/s',create_function('$a','return "[code]" . pack("H*",$a[1]) . "[/code]";'),$a);
echo $a;
echo "\n";