将带编号的列表文本转换为嵌套的HTML列表
Convert numbered lists text to nested HTML lists
底部更新
也许有人能帮上忙。。。已经挣扎了好几天,我被屏蔽了:/
对于我正在使用的内容清理器解决方案,我正在尝试转换一些纯文本编号的列表,如:
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进行一个小的更改……玩得开心:)
相关文章:
- 从多维嵌套json数组创建下拉列表
- 默认情况下折叠和展开嵌套列表
- 如何递归地获取嵌套对象中所有子对象的列表
- 在Twitter BootStrap嵌套下拉列表中托管一个选择列表(IE 9特定)
- 在JSP中获取嵌套形式的select列表值
- 带角度指令的嵌套树列表
- 在javascript/angular中创建播放列表(按值复制数组,但按引用设置嵌套对象)
- 在 Joomla (1.7.0) 中单击时显示嵌套列表
- ReactJs - 列表组件中的嵌套列表组件
- 如何迭代json对象的嵌套属性并创建新的数组列表
- Extjs 4-associations hasMany不在loadData上加载嵌套列表
- 在AngularJS 1.5.x中嵌套列表并更正ng模型和ng值
- 列表中呈现的骨干嵌套json对象
- Javascript-嵌套列表获胜't展开
- 基于类名创建嵌套列表
- 使用regexp分析嵌套的降价列表
- 标题和列表的嵌套计数
- AngularJS:具有任意深度的嵌套列表
- 如何在sencha touch中获取嵌套列表
- 限制要在嵌套列表jQuery中添加的列表元素的数量