将编号列表文本转换为嵌套HTML列表

时间:2012-03-23 13:03:38

标签: php javascript jquery list nested

在底部更新

也许有人可以帮忙解决这个问题......几天来一直在努力,我被封锁了:/

对于我正在使用的内容清理器解决方案,我正在尝试转换一些纯文本编号列表,例如:

1 Foo
1.1 Foo 1
1.2 Foo 2
2 Bar
2.1 Bar 1
2.2 Bar 2
2.2.1 Bar 2.1
2.2.2 Bar 2.2
2.3 Bar 3
3 Z Another root item

...进入正确的嵌套html列表...

<ul>
    <li>Foo
        <ul>
            <li>Foo 1</li>
            <li>Foo 2</li>
        </ul>
    </li>
    <li>Bar
        <ul>
            <li>Bar 1</li>
            <li>Bar 2
                <ul>
                    <li>Bar 2.1</li>
                    <li>Bar 2.2</li>
                </ul>
            </li>
            <li>Bar 3</li>
        </ul>
    <li>Another root item</li>
</ul>

可能有所帮助的一些事情:

  • 无需正确缩进结果,只需用正确的html标记
  • 包围
  • 无需在另一个文本中找到列表,可以认为我已经只有列表
  • 不需要出色的性能,正则表达式,itaration ......无论工作得好还是
  • 不需要特定的语言解决方案,PHP,Python,Javascript,Pseudocode ......很好
  • 可以将“”(空格)设为“1.2.3”列表文本
  • 之后的唯一分隔符
  • 可以假设行已经按照正确的顺序排列,无需按顺序排序

UPDATE TLTR(不是作业,但是现实世界的用法)

很抱歉看到“功课没做”,我的错。英语不是我的语言,我试着简明扼要。 我要做的是让我的同事更容易格式化文本,从正确的来源纠正HTML。

我设法完成了一天(你可以在这里查看完整的屏幕截图http://twitpic.com/907aw5/,因为我无法附加图像,这是我的第一个问题,没有声誉):

  • 我收到原始文本并在其上执行strip_tags以删除任何不正确的HTML
  • 我将其插入textarea
  • 我将Javascript编辑器(Codemirror http://codemirror.net)与HTML
  • 的规范集成在一起
  • 我注入了一个版本栏,其中包含我们使用的最常见的标签,因为我的工作人员对HTML不了解
  • 作为清洁选项的一部分,我设置了两个热键,它们生成所选文本的ul / ol(打破\ n字符)
  • 当用户保存时,我在其上运行HTMLTidy,使其变得像posible一样清晰(缩进,删除专有标签等等)

刚刚完成,正如您在上面的截图中看到的那样,我有很多1.2.3“组织”的文本,能够从中获取嵌套列表解决方案将会有很大帮助一种文字。


更新(特定需求)

现在解释“为什么”我用了很多子弹作为假设:

  • 不需要正确缩进结果,只需用正确的html标签包围(因为在此之后,当用户点击“保存”按钮时,我会在其上运行htmltidy,因此它会缩进)
  • 无需在另一个文本中找到列表,可以sume我已经只有列表(因为我在编辑器中运行用户选择的文本上的代码,所以我可以选择正确的列表)
  • 不需要出色的性能,正则表达式,itaration ......无论工作正常(因为它是人类使用,点击,点击,我不介意每次使用需要0.0001秒,或0.1 )
  • 不需要特定的语言解决方案,PHP,Python,Javascript,Pseudocode ......很好(我打算在javascript / jQuery中使用它,但我需要的只是逻辑,因为我被阻止了...如果解决方案是用另一种语言,我可以贬低它)
  • 可以将“”(空格)作为“1.2.3”列表文本之后的唯一分隔符(因为它是我文本案例的99%)
  • 可以假设行已经按照正确的顺序排列,根本不需要对它们进行排序(正如您在屏幕截图中看到的那样,该文本是人为输入的,我认为它们按照正确的顺序插入)

再次抱歉没有明确表示,只是我在Stackoverflow中的第一个问题,我没有意识到它看起来像家庭作业,我的错。

1 个答案:

答案 0 :(得分:3)

仅仅为了测试,我继续使用PHP编写了一个解决问题的方法:

function helper_func($m)
{
    static $r=0;
    $o='';
    $l=preg_match_all("#\d+#",$m[1],$n);
    while($l < $r)
    {
        $r--;
        $o .= '</li></ul>';
    }
    if($l == $r)return $l == 0?$o.$m[0]:$o.'</li><li>'.$m[0];
    else $o=$m[0];
    while($l > $r)
    {
        $r++;
        $o = '<ul><li>'.$o;
    }
    return $o;
}
echo preg_replace_callback("#^([0-9.]*).*$#m","helper_func",$input);

然而,为了尊重这个作业,我提出了一个故意的错误:因为它正确地出来,你需要在传入之前对$ input做一个小的改动......玩得开心:)