2010-06-07 71 views
0

我需要將列表中的最後一個頂層 LI的起始標記定位到列表中,該列表可能包含或不包含各種職位中的子列表 - 不使用CSS或Javascript。正則表達式目標列表中的最後一個主要列表

是否有一個簡單/優雅的正則表達式可以幫助這個?我不是古茹w /他們,但當我選擇所有中間文本(。*)/(。+)更改時,似乎需要貪婪/非貪婪選擇器,因爲嵌套列表被添加並在名單 - 這是拋棄我。

$pattern = '/^(<ul>.*)<li>(.+<\/li><\/ul>)$/'; 
$replacement = '$1<li id="lastLi">$3'; 

也許有一個更簡單的方法??轉換爲XML來定位LI然後轉換回來?

即: 單元素

<ul> 
    <li>TARGET</li> 
</ul> 

多個元素

年底前
<ul> 
    <li>foo</li> 
    <li>TARGET</li> 
</ul> 

嵌套列表

<ul> 
    <li> 
     foo 
     <ul> 
      <li>bar</li> 
     </ul> 
    <li> 
    <li>TARGET</li> 
</ul> 

嵌套列表月底

<ul> 
    <li>foo</li> 
    <li> 
     TARGET 
     <ul> 
      <li>bar</li> 
     </ul> 
    </li> 
</ul> 

回答

6

You should never use regex to parse HTML。特別是在這種特殊情況下(遞歸標籤)。

總的來說,主要原因是HTML不是常規語言。

除了HTML不是一種常規語言,並且不能用正則表達式100%正確解析這一事實之外,正則表達式解析HTML的任務「足夠好」已經足夠複雜了,以至於你更有可能沒有會在你的代碼中出現錯誤。

而是使用designated HTML parser

+0

+1,更應如此,在這個情況下,這將是特別困難的事與正則表達式。正則表達式不適合遞歸結構。 (不,一些正則表達式引擎提供的「遞歸正則表達式」東西不是很好用。) – 2010-06-07 20:26:02

+1

+1,如果你想要頂級遞歸,這是非常困難的。我想知道誰降低了這一點,因爲在這種情況下,這是完全正確的。事實並非總是如此,你不應該使用正則表達式來解析HTML,但這裏肯定是。 – 2010-06-07 20:28:12

+1

雖然該鏈接是一個很好的(如幽默)閱讀,但它並沒有告訴OP很多「爲什麼」他/他不應該做這樣的事情。我發現這樣的答案(只發布到「html + regex線程」的鏈接)與LMGTFY鏈接的類型相同:不是SO的分支。因此我投了票。 – 2010-06-07 20:30:49

1

使用不是正則表達式的html解析器。

1

如果對於必須處理的HTML數據有足夠的信心,XML轉換和DOM解析是最簡單的方法。