正则表达式匹配<ul>元素</ul>

时间:2014-05-23 17:58:28

标签: php html regex

我一直在研究一个输出数据库中所有类别的catagory系统。 因为我正在拉动无限的分类(理论上),我有时会有<ul>个不包含<li>元素的元素(或其他任何内容,除了空格)

我目前正在使用jQuery来过滤这些<ul>元素,但正如您有意认为这不是最有效的方法。 我一直试图制作正则表达式,以便用空字符串替换这些空的<ul>元素,但到目前为止我还没有多少运气。

<ul class="nav navbar-nav catagory" style="display:none;">

</ul>

上面的HTML是我需要过滤掉的空<ul>的示例。 到目前为止,我有这个正则表达式声明,但它没有按预期工作。

$str = '<ul class="nav navbar-nav catagory" style="display:none;">             </ul>';
preg_match('!\<ul\>/ +/\<\/ul\>!', $str, $matches);

任何人都可以帮助我吗?

此类内容也存储在PHP内的变量中。

编辑:

由于Josh Beam,我解决了这个问题,我编辑了我的功能,其中的数据库是从数据库中删除的:

function build_catagory($parent, $row = NULL)
{
    global $db, $template;

    // Initialise array
    $data = array();

    // Next level parent
    $next = $parent + 1;

    // Basic SQL statement
    $sql = "SELECT * FROM Rubriek";

    // Where condition based on $row
    if(is_null($row))
    {
        $where = " WHERE Hoofdrubriek IS NULL";
    }
    else 
    {
        $where = " WHERE Hoofdrubriek = '" . $row['Rubrieknummer'] . "'";
    }

    // Execute query
    $stmt = $db->query($sql . $where);

    if($stmt)
    {
        // Create new instance of template engine (set output to false)
        $catagory = new Template('{', '}', array('content'), FALSE);

        // Load template
        $catagory->load(T_TEMPLATE_PATH . '/rubrieken.html', 'content');

        // Fetch results
        while($row = $db->fetch($stmt))
        {
            $data[] = array(
                'CATAGORY_NAME'     => ucfirst(strtolower($row['Rubrieknaam'])),
                'CATAGORY'          => build_catagory($next, $row),
            );
        }

        // Assign data to the template
        $catagory->assign_vars(array(
            'CATAGORIES'            => $data,
            'CATAGORIES_DISPLAY'    => ($parent == 0 ? '' : 'style="display:none;"'),
        ));

        // Return catagory
        return $catagory->parse();
    }
    else
    {
        return '';
    }
}

实际上修复非常简单,只需重新设置空字符串而不是模板中的解析。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

这里强制执行的重要一点是列表打开和关闭标记之间只有空格。由于我们不解析任何分层数据,因此正则表达式可以有效地完成。

更易读的解决方案:

  • \<ul[^\>]*\>\s*\<\/ul\>

稍微更安全的版本会在流氓空格的情况下使用更多\s*

  • \<\s*ul[^\>]*\>\s*\<\s*\/ul\s*\>