2012-07-19 60 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'); 
相关问题