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

Convert numbered lists text to nested HTML lists

本文关键字:列表 嵌套 HTML 转换 文本 编号      更新时间:2023-09-26

底部更新

也许有人能帮上忙。。。已经挣扎了好几天,我被屏蔽了:/

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

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标记包围即可
  • 不需要在另一个文本中定位列表,可以假设我已经只有列表了
  • 不需要出色的性能、regexp、itaration。。。任何有效的都是好的
  • 不需要特定的语言解决方案,PHP,Python,Javascript,Pseudocode。。。很好
  • 可以将"(空格)作为"1.2.3"列表文本后的唯一分隔符吗
  • 我的行已经按正确的顺序排列了,根本不需要订购

更新TLTR(不是家庭作业,而是真实世界的用法)

对不起,我的错,你看起来这么"作业没做完"。英语不是我的语言,我尽量做到简明扼要。我想做的是让我的同事更容易格式化文本,以更正未知来源的html。

直到今天,我还是设法做到了(你可以在这里看到完整的屏幕截图http://twitpic.com/907aw5/因为我不能把图片作为我的第一个问题,也没有声誉):

  • 我得到了原始文本,并在上面做了一个strip_tag,以删除它可能包含的任何不正确的HTML
  • 我把它插入一个文本区域
  • 我集成了一个Javascript编辑器(Codemirrorhttp://codemirror.net)与HTML规范
  • 我在编辑栏中注入了我们使用的最常见的标签,因为我的同事对HTML一无所知
  • 作为清理选项的一部分,我设置了两个热键,使所选文本的ul/ol(打断字符)
  • 当用户保存时,我在上面运行HTMLTidy,使其尽可能干净(缩进、删除propietary标记等)

最后,正如你在上面的屏幕截图中看到的,我有很多关于1.2.3"组织"的文本,能够从这种文本中获得嵌套列表解决方案会有很大帮助。


更新(特殊需求)

现在解释"为什么"我用了这么多子弹作为假设:

  • 结果不需要正确缩进,只需被正确的html标记包围即可(因为在这之后,当用户点击Save按钮时,我会在它上运行html整洁,所以它会缩进)
  • 不需要在另一个文本中定位列表,可以假设我已经只有列表了(因为我在编辑器中对用户选择的文本运行代码,所以我可以假设他选择了正确的列表)
  • 不需要出色的性能、regexp、itaration。。。任何有效的都可以(因为它是人类使用的,点击,点击,我不介意每次使用需要0.0001秒,还是0.1秒)
  • 不需要特定的语言解决方案,PHP,Python,Javascript,Pseudocode。。。很好(我打算在javascript/jQuery中使用它,但我需要的只是逻辑,因为我被阻止了……如果解决方案是另一种语言,我可以重新翻译它)
  • 可以将"(空格)作为"1.2.3"列表文本后的唯一分隔符吗(因为它是我99%的文本大小写)
  • 行是否已经按照正确的顺序排列,根本不需要排列(正如你在屏幕截图中看到的,该文本是人工输入的,我认为他们是按照正确的次序插入的)

再次抱歉我没有弄清楚,这只是我在Stackoverflow中的第一个问题,我没有意识到这看起来像家庭作业,我的错。

为了好玩,我继续使用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进行一个小的更改……玩得开心:)