2012-03-23 131 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