2010-10-24 7 views
0

Nous avons la variable $menu avec le code HTML à l'intérieur (il n'y a pas de boucle, cela provient d'une fonction).Déplacer la valeur de l'attribut de classe vers la variable php

Sur echo il donne le code comme ceci:

<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> 

Ce que je veux faire:

  1. valeur get du class="" de chaque <li>.

  2. si active existe dans cette valeur, puis passez à l'étape 3).

  3. rechercher un, deux, trois, quatre, cinq valeur interne. Si l'un d'eux existe, alors jette son nom à la variable php.

variable $menu devrait donner:

$name = 'two'; 

Quelle est la solution?

+0

Quelle est la différence à [titre Déplacer valeur d'attribut à la valeur d'attribut de classe dans le code HTML] (http://stackoverflow.com/questions/4007569/move-title-attribute-value-to-class-attribute -value-dans-le-code-html)? – Gumbo

+0

Cela semble vraiment compliqué. Quel est le but ultime ici? –

+0

@Gumbo, cette question ressemble à ça, mais c'est différent. – James

Répondre

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; 
0

Vous devez utiliser des expressions régulières. Ou si vous pouvez attraper chaque classe d'objets Li dans les fonctions précédentes peut être plus facile.

+1

Vous devriez garer votre voiture avec une pierre sous votre pneu. Mais vous pourriez aussi juste juser quelque chose que la voiture a déjà fait à cet effet comme un frein à main (XPath pour interroger des documents XML). – ITroubs

+0

Je viens d'apprendre quelque chose de nouveau, merci d'une manière ou d'une autre. – infinity

+0

qu'est-ce qui ne va pas avec regex? Il faut beaucoup de mémoire à gérer, ou beaucoup de temps, ou quoi d'autre, pourquoi vous détestez ça? – James

3

Utilisez une requête XPath.

voir ici: http: //php.net/manual/en/domxpath.query.php

+0

pouvez-vous donner un exemple? – James

+0

Nice aussi, hehehe. +1 – Dave

+0

@Happy I [vous a déjà donné tout l'exemple dont vous avez besoin pour résoudre votre problème] (http://stackoverflow.com/questions/3958403/catch-first-and-last-li-inside-php-variable/3958493 # 3958493). Pourquoi ne pas aller dans le manuel PHP et apprendre à utiliser DOM au lieu d'attendre des gens de vous fournir les codes que vous pouvez copier et coller. Ne demandez pas un poisson. Apprenez à pêcher. – Gordon

0

Je pense que vous devriez envelopper la solution dans une fonction.

Les expressions régulières correspondent au travail, mais je pense que vous pouvez également utiliser la classe DOM. Quelque chose comme:

$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); 

C'est tout.