将类属性值移动到php变量

时间:2010-10-24 14:59:33

标签: php html css html-lists

我们的变量$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>

我想做什么:

  1. 获取每个class=""的{​​{1}}的值。

  2. 如果此值中存在有效,则转到3)步骤。

  3. 搜索一,二,三,四,五内部值。如果其中一个存在,则将其名称抛给php变量。

  4. 变量<li>应该给出:

    $menu

    解决方案是什么?

4 个答案:

答案 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);

就是这样。