【问题标题】:Move class attribute value to php variable将类属性值移动到 php 变量
【发布时间】:2010-10-24 14:59:33
【问题描述】:

我们有变量$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. 获取每个&lt;li&gt;class=""的值。

  2. 如果active在该值中存在,则执行3)步骤。

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

变量$menu 应该给出:

$name = 'two';

解决办法是什么?

【问题讨论】:

标签: php html css html-lists


【解决方案1】:

使用 XPath 查询。

见这里:http://php.net/manual/en/domxpath.query.php

【讨论】:

【解决方案2】:
$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;

【讨论】:

    【解决方案3】:

    你应该使用正则表达式。

    或者如果你能在前面的函数中捕捉到每个李项目类 可能会更容易。

    【讨论】:

    • 您应该在轮胎下放一块石头。但是你也可以只考虑汽车已经为此目的制造的东西,比如手刹(用于查询 xml 文档的 XPath)。
    • 正则表达式有什么问题?处理需要大量内存,或者需要很多时间,或者其他什么,你为什么讨厌它?
    【解决方案4】:

    我认为你应该将解决方案包装成一个函数。

    正则表达式适合这项工作,但我认为您也可以使用 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);
    

    就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 2011-07-19
      • 1970-01-01
      • 2011-10-22
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多