如何通过 preg_replace 将 bbcode 替换为标签 HTML?

How to replace bbcode to tags HTML via preg_replace?

我在页面上有 bbcodes:

[list=1]
[*]Камиль [/*]
[*]Хисматуллин [/*]
[*]живет в настоящий [/*]
[/list]

如何将这些 bbcode 替换为 HTML 标签:

<ul>
<li></li>
<li></li>
<li></li>
</ul>

我试过正则表达式:

$advanced_bbcode = array(
 '#\[list=([0-9]?)](.+)\[/list]#Usi',
 '#\[*](.+)\[/*]#Usi'
);

$advanced_html = array(
   '<ol></ol>',
   '<li></li>'
);

$text = preg_replace($advanced_bbcode, $advanced_html,$text);
$advanced_bbcode = array(
  '#\[list=[0-9]+\](.+)\[\/list\]#i',
  '#\[\*\](.+)\[\/\*\]#i'
);

$advanced_html = array(
  '<ol></ol>',
  '<li></li>'
);

$text = preg_replace($advanced_bbcode, $advanced_html, $text);

您需要稍微调整一下正则表达式(添加 Singleline 内联 (?s) 选项,该选项可以与不区分大小写的 (?i) 选项结合使用,剩下的就很整洁了。只是我不知道你需要<ol>还是<ul>(你可以自己调整那部分)。这是我的解决方案(在 TutorialsPoint 上测试):

<?php

   $str = "[list=1]\n[*]Камиль [/*]\n[*]Хисматуллин [/*]\n[*]живет в Урюпинске [/*]\n[/list]"; 

   $advanced_bbcode = array(
     '/(?si)\[list=\d+\](.*?)\[\/list\]/',
     '/(?si)\[\*\](.*?)\[\/\*\]/'
    );
    $advanced_html = array(
      '<ol></ol>',
      '<li></li>'
    );
    $text = preg_replace($advanced_bbcode, $advanced_html, $str);
    echo $text;
?>

输出:

<ol>                                                                                                                                                                
<li>Камиль </li>                                                                                                                                                    
<li>Хисматуллин </li>                                                                                                                                               
<li>живет в Урюпинске </li>                                                                                                                                         
</ol>