【发布时间】:2013-10-23 15:14:15
【问题描述】:
我正在尝试制作标记以格式化有序列表,这是标记样式:
$strings = "1. dog
1. cat
1. fish
1. horse
1. monkey
1. pig
";
该列表中的horse 和monkey 应该是子列表的一部分,因为它们在数字前有一个空格。这是我正在使用的代码:
function blq($match){
$str = preg_replace("/^1\. (.+?)$/m", "<li>$1</li>", $match[0]);
$str = preg_replace_callback("/(?:^1\. .+(\n|$))+/m", 'blq', $str);
return "<ol>$str</ol>";
}
$string = preg_replace_callback("/(?:^ ?1\. .+(\n|$))+/m", 'blq', $strings);
echo $string;
该代码正在创建此输出:
<ol><li>dog
</li>
<li>cat
</li>
<li>fish
</li>
1. horse
1. monkey
<li>pig
</li>
</ol>
horse 和 monkey 没有创建为子列表,只是被忽略了。我觉得我离答案越来越近了,但我不知道该怎么做才能得到那个答案......
注意我想允许无限数量的子列表
【问题讨论】:
-
只是对一些事情感到好奇。双引号中的
$1不会尝试插入吗? (它们不应该用单引号吗?)另外,您确定要使用/m修饰符吗?如果是这样,(\n|$)对我来说没有意义,因为$匹配\n。 -
$1不是有效变量,因此它被读取为文本。我正在使用/m,因为我正在进行多行搜索,所以我认为这是正确的。对于(\n|$),我不确定。
标签: php regex markdown preg-replace-callback