如何通过preg_replace替换bbcode来标记HTML?

时间:2015-04-03 19:51:26

标签: php regex preg-replace preg-match preg-match-all

我在页面上有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>$1</ol>',
   '<li>$1</li>'
);

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您需要稍微调整正则表达式(添加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>$1</ol>',
      '<li>$1</li>'
    );
    $text = preg_replace($advanced_bbcode, $advanced_html, $str);
    echo $text;
?>

输出:

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