我们的变量$menu
里面有HTML(没有循环,它来自一个函数)。
在echo
上,它会提供如下代码:
<ul id="menu">
<li id="some-id" class="many classes one"><a href="#">text</a></li>
<li id="some-id" class="many classes second active"><a href="#">text</a></li>
<li id="some-id" class="many classes three"><a href="#">text</a></li>
</ul>
我想做什么:
获取每个class=""
的{{1}}的值。
如果此值中存在有效,则转到3)步骤。
搜索一,二,三,四,五内部值。如果其中一个存在,则将其名称抛给php变量。
变量<li>
应该给出:
$menu
解决方案是什么?
答案 0 :(得分:3)
使用XPath查询。
见这里:http://php.net/manual/en/domxpath.query.php
答案 1 :(得分:1)
$html = '<ul id="menu">
<li id="some-id" class="many classes one"><a href="#">text</a></li>
<li id="some-id" class="many classes two active"><a href="#">text</a></li>
<li id="some-id" class="many classes three"><a href="#">text</a></li>
</ul>';
$active = 'active';
$valid = array('one','two','three','four','five');
$x = simplexml_load_string($html);
foreach($x->xpath('//ul/li[contains(@class,'.$active.')]') as $li)
{
if($common = array_intersect($valid, explode(' ',$li->attributes()->class)))
{
$menu = array_shift($common);
break;
}
}
echo $menu;
答案 2 :(得分:0)
您应该使用正则表达式。
或者,如果您可以在之前的函数中捕获每个Li项目类 可能会更容易。
答案 3 :(得分:0)
我认为你应该将解决方案包装成一个函数。
正则表达式适合该作业,但我认为您也可以使用DOM类。类似的东西:
$menu = '<ul id="menu">
<li id="some-id" class="many classes one"><a href="#">text</a></li>
<li id="some-id" class="many classes two active"><a href="#">text</a></li>
<li id="some-id" class="many classes three"><a href="#">text</a></li>
</ul>';
// using a constant instead a "magic number" inside below function
define(NUMBER_POSITION, 2);
function getActiveItem($menuStr) {
$doc = new DOMDocument();
$doc->loadXML($menuStr);
$listItems = $doc->getElementsByTagName('li');
foreach($listItems as $listItem) {
// case count equals 1, expression will be true
if (substr_count($listItem->getAttribute('class'), 'active')) {
$classes = explode (' ',$listItem->getAttribute('class'));
return $classes[NUMBER_POSITION];
}
}
}
echo getActiveItem($menu);
就是这样。