PHP:在html元素中查找类的正则表达式
问题描述:
我有一个带有子菜单的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);
答
你会好得多使用DOMDocument和DOMXPath。他们提供了导航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
答
要启动,第二<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>"
答
为此使用jQuery或JavaScript。
这是一种用jQuery做到这一点:
$('.sub-menu').find('li:first-child').addClass('first-item');
为什么你想用PHP来做到这一点? PHP构建HTML。这种事通常是用JavaScript来完成的。 – 2012-07-19 13:48:29
http://simplehtmldom.sourceforge.net/ ??检查第二个例子 - 如何修改HTML DOM元素 - 或者 - 使用javascript? – TigerTiger 2012-07-19 13:48:53
@JezenThomas:HTML不一定是输出,即使是,可访问性仍然是一个有效的问题。 Joudicek:使用HTML解析器和序列化程序,例如'DOMDocument'。 – 2012-07-19 13:51:55