2012-03-23 86 views
-1

UPDATE在底部转换编号列表的文本嵌套的HTML列出

也许有人会用这个...一直与它挣扎天助我就是阻止:/

对于内容-cleaner解决我的工作中,我试图一些纯文本编号列表转换,如:

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 ......任何作品都很好
  • 无需especific语言解决方案,PHP,Python和JavaScript中,伪...是罚款
  • 能asume“”(空格)作为后唯一的分隔符“1.2.3”列表文本
  • 能asume线已经在正确的顺序,没有必要在所有

UPDATE TLTR(不做作业,而现实世界中使用),责令其

对不起寻找这样的“功课没做”,我故障。英语不是我的语言,我想尽可能简洁。 我想要做的是让我的同事更容易地格式化文本,以纠正来自未知来源的html。

最多一天我设法(你可以在这里看到完整的截图http://twitpic.com/907aw5/,因为我不能附加图片是我的第一个问题,没有口碑):

  • 我得到的原始文本,并做了用strip_tags它来删除任何不正确的HTML它可以有
  • 我将其插入一个文本
  • 我集成了一个JavaScript编辑器(Codemirror http://codemirror.net)与规范HTML
  • 我注入一版吧,最常见的标签w^E使用,因为我的同事不知道关于HTML字
  • 作为清洗选项的一部分,我设置两个快捷键,使所选文本的UL/OL(在\打破ñ字符)
  • 当用户保存,我运行它的HTMLTidy它变得更清洁的posible(缩进,删除propietary标签等...)

刚刚完成,你可以看到在上面的截图,我有有很多1.2的文字。3“组织”,并且能够从这种文本中获得嵌套列表解决方案会有很大帮助。


UPDATE(该especific需求)

现在的解释 “为什么” 我用asumptions这么多子弹:

  • 无需得到的结果是正确的缩进,只是包围正确的html标签(因为在此之后,当用户点击保存按钮,我运行htmltidy就可以了,所以它缩进了)
  • 没有必要在另一个文本内找到列表,可以sume我已经只有列表(因为我运行代码在编辑器中的用户选择的文本,所以我可以sume他选择了正确的列表)
  • 没有需要伟大的表现,正则表达式,itaration ...无论作品是好的(因为它是一个人用,点击,点击,我不介意,如果它需要0.0001秒的使用,或0.1)
  • 无需特定的语言解决方案,PHP,Python,Javascript,伪代码...很好(我打算在javascript/jQuery中使用它,但是我需要的仅仅是逻辑,因为我被阻止了......如果解决方案是用另一种语言,我可以使其失明)
  • Can asume“”(空格)作为“1.2.3”列表文本之后的唯一分隔符(因为它是我的文本案例的99%)
  • asume行已经在正确的顺序,没有必要订购它们(正如你可以在屏幕截图中看到的那样,该文本是人工输入的,并且我假设他们以正确的顺序插入它)

对不起,我不明白,只是我在Stackoverflow的第一个问题,我没有意识到它会看起来像作业,我的错。

+1

你现在试过了吗? – m90 2012-03-23 13:07:38

+1

对不起马科斯,我们不能为你做功课。你为什么不自己尝试一下,如果不行,那就寻求帮助。 – Benubird 2012-03-23 13:19:26

+0

为什么这听起来像一个懒惰的家庭作业问题? – SpYk3HH 2012-03-23 13:22:08

回答

3

只是为了funsies,我继续用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); 

然而,为了这一目的而存在的功课,我包括故意的错误:它正确地走出来,你需要做一个小的改变,以$输入之前通过...玩得开心:)

+0

对不起,我不明白,只是我在Stackoverflow的第一个问题,我没有意识到它会看起来像作业,我的错。我用现实世界的问题编辑了这个问题。无论如何,我要尝试你的解决方案(并找到变化),并回来,谢谢@Benubird – 2012-03-23 15:34:20

+0

我想我完全配得上我的坏首先发布......似乎没有人会看到我的解释:_)我尝试了你的解决方案,它似乎工作正常,尽管它并没有删除“1.2.3”号码,但它创建了嵌套李的正确。除此之外,我的疑问是...错误是我需要在$ input的末尾添加一个空行来插入最后的结尾“< /li >< /ul >”?只是要确定...无论如何投票你的解决方案:) – 2012-03-23 17:05:23

+1

@MarcosBesteiroLópez是的!就是这样:)。有趣的是,当我看着你的例子时,我认为它仍然有数字......我的错误。如果你想从前面删除数字,我只需在函数的开始处输入$ m [0] = substr($ m [0],strlen($ m [1])+ 1)。 – Benubird 2012-03-23 19:17:57