2012-07-19 59 views
-1

我有一個帶有子菜單的html ul菜單。我想用PHP添加一個「第一項」類到第一個子菜單項。PHP:在html元素中查找類的正則表達式

<ul id="menu-main" class="menu"> 
    <li id="menu-item-68" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-68"><a href="...">ITEM1</a></li> 
    <li id="menu-item-69" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-69"><a href="...">ITEM2</a> 
    <ul class="sub-menu"> 
    <li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li> 
    <li id="menu-item-71" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-71"><a href="...">SUB-ITEM2</a></li> 
    </ul> 
    <li id="menu-item-73" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-73"><a href="...">ITEM3</a></li> 
</ul> 

(尋找 「第一項」 裏面的文字)

到目前爲止,我來是這樣的:

$output = preg_replace('/(sub-menu.*class.*)menu-item/smi', '$1 first-item menu-item', $output, 1); 
+1

爲什麼你想用PHP來做到這一點? PHP構建HTML。這種事通常是用JavaScript來完成的。 – 2012-07-19 13:48:29

+2

http://simplehtmldom.sourceforge.net/ ??檢查第二個例子 - 如何修改HTML DOM元素 - 或者 - 使用javascript? – TigerTiger 2012-07-19 13:48:53

+1

@JezenThomas:HTML不一定是輸出,即使是,可訪問性仍然是一個有效的問題。 Joudicek:使用HTML解析器和序列化程序,例如'DOMDocument'。 – 2012-07-19 13:51:55

回答

1

你會好得多使用DOMDocumentDOMXPath。他們提供了導航DOM的方法。你會用下面的東西來找到子菜單(儘管我沒有測試它,所以xpath可能不完全正確)。一旦找到了你感興趣的DOM元素,你就可以修改它的類屬性。

$dom = new DOMDocument(); 
$dom -> loadHTML ($htmlString); 
$path = new DOMXpath ($dom); 

$firstItem = $path -> query ('//ul[@id="main-menu"]//ul[@class="sub-menu"]/li[1]'); 
+1

+1 DOMDocument絕對是這裏的方式 – nickb 2012-07-19 14:38:15

1

要啓動,第二<li>缺少閉幕</li>。固定,將允許你使用這個,它使用DOM文檔/ DOMXPath更改類第一<li>子菜單:

$doc = new DOMDocument; 
$doc->loadHTML($html); 

$xpath = new DOMXPath($doc); 
$first_node = $xpath->query('//ul[@id="menu-main"]/ul[@class="sub-menu"]/li')->item(0); 

$new_class = $doc->createAttribute("class"); 
$new_class->appendChild($doc->createTextNode("first-item ")); 
$new_class->appendChild($doc->createTextNode($first_node->getAttributeNode("class")->value)); 

$first_node->setAttributeNode($new_class); 

這使得第一<li>在子菜單look like

string(198) "<li id="menu-item-70" class="first-item menu-item menu-item-type-post_type menu-item-object-page menu-item-70"><a href="...">SUB-ITEM-1</a></li>" 
1

爲此使用jQuery或JavaScript。

這是一種用jQuery做到這一點:

$('.sub-menu').find('li:first-child').addClass('first-item'); 
相關問題