Переместить значение атрибута класса в переменную php - PullRequest
0 голосов
/ 24 октября 2010

У нас есть переменная $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="" каждого <li>.

  2. , если активно существует в этом значении, затем перейдите к шагу 3).

  3. найдите один, два, три, четыре, пять внутреннее значение.Если один из них существует, то бросьте его имя в переменную php.

Переменная $menu должна дать:

$name = 'two';

Какое решение?

Ответы [ 4 ]

3 голосов
/ 24 октября 2010

Используйте запрос XPath.

см. Здесь: http://php.net/manual/en/domxpath.query.php

1 голос
/ 24 октября 2010
$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;
0 голосов
/ 24 октября 2010

Я думаю, вы должны обернуть решение в функцию.

Регулярные выражения подходят для работы, но я думаю, что вы также можете использовать класс 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);

Вот и все.

0 голосов
/ 24 октября 2010

Вы должны использовать регулярные выражения.

Или, если вы можете поймать каждый класс элементов Ли в предыдущих функциях может быть проще.

...