类似Wiki中的列表转换程序

类似Wiki中的列表转换程序
[quote]
sub str2tree{
my $str=shift;
for(my $i=0;$str=~s/\n((([\*\#]{$i}\#).+?\n)+)/\n$3<ol>\n$1$3<\/ol>\n/s;$i++){}
for(my $i=0;$str=~s/\n((([\*\#]{$i}\*).+?\n)+)/\n$3<ul>\n$1$3<\/ul>\n/s;$i++){}
$str=~s/(\n)[\#\*]+(<ol>|<\/ol>|<ul>|<\/ul>)/$1$2/g;
$str=~s/(\n)[\#\*]+(.+)/$1<li>$2<\/li>/g;
return $str;
}
[/quote]
输入参数:
list*list
*list1
**list1_1
**list1_2
**#list1_2_1
**#list1_2_2
**#*list1_2_2_1
**#*list1_2_2_2
**#list1_2_3
**list1_3
*list2
*list3
#num1
#num2
#num3
##num3_1
##*num3_1_1
##*num3_1_2
##*#num3_1_2_1
##*#num3_1_2_2
##*#num3_1_2_3
##*num3_1_3
##num3_2

函数返回:
[quote]list*list
<ul>
<li>list1</li>
<ul>
<li>list1_1</li>
<li>list1_2</li>
<ol>
<li>list1_2_1</li>
<li>list1_2_2</li>
<ul>
<li>list1_2_2_1</li>
<li>list1_2_2_2</li>
</ul>
<li>list1_2_3</li>
</ol>
<li>list1_3</li>
</ul>
<li>list2</li>
<li>list3</li>
</ul>
<ol>
<li>num1</li>
<li>num2</li>
<li>num3</li>
<ol>
<li>num3_1</li>
<ul>
<li>num3_1_1</li>
<li>num3_1_2</li>
<ol>
<li>num3_1_2_1</li>
<li>num3_1_2_2</li>
<li>num3_1_2_3</li>
</ol>
<li>num3_1_3</li>
</ul>
<li>num3_2</li>
</ol>
</ol>
[/quote]