我有一个动态菜单生成php/mysql像这样
<ul>
<li>Category 1
<ul>
<li>Genre 1</li>
<li>Genre 2</li>
</ul>
</li>
<li>Category 2
<ul>
<li>Genre 1</li>
<li>Genre 2</li>
</ul>
</li>
<li>Category 3
<ul>
<li>Genre 1</li>
<li>Genre 2</li>
</ul>
</li>
</ul>
为了节省服务器请求,有一个cron作业设置,每天一次将其打印到外部html文件中(整个站点都使用)。
有没有在这个多级ul上运行一个类似mysql的搜索并返回结果?例如,
select 'li' WHERE genre LIKE "$search"
返回类别和类型。
感谢大家的时间和帮助。
我首先要说的是,所有鼓励你不要这么做的评论都是正确的。您应该在数据库中执行此操作。说真的,不要这样做!
但…如果我假装没有涉及到数据库,我们只是试图解决解析HTML结构有点像数据库,根据您的要求,我会尝试使用jQuery。我将创建一个如下的函数:
function list_search(query) {
var results = $("li:contains("+query+")")
if (results.parents('li').length > 0) {
return results.parents('li');
}else{
return $("li:contains("+query+")");
}
这是特别针对你的列表结构进行微调的——如果你的列表深度超过三级,你就必须重新访问它。如果您对"Category 3"进行查询,它将返回带有子列表的<li>
元素。如果你对"Genre 2"进行查询,你将得到每个类别的<li>
元素,因为在你的例子中每个类别都包含一个"Genre 2"项目,我认为这就是你正在寻找的行为。
显然,这是一个客户端解决方案,如果您试图在服务器上使用cron-job和诸如此类的东西来完成此操作,则可能没有帮助。看起来您正在使用基于标记的PHP。这里有一个很方便的基于jQuery的phpQuery库我们可以很容易地将其转换到
$document = phpQuery::newDocumentFile('badidea.html');
function list_query($query) {
$result = pq('li:contains('.$query.')');
if (strlen($result->parents("li")) > 0) {
return $result->parents("li");
}else{
return $result;
}
}
phpQuery的Github版本似乎比Google Code版本早了2年。->parents()
方法似乎不在谷歌代码网站上的示例中,所以我不确定它是否受支持,但它适用于Github版本。
所以…我希望您能从数据库中找到解决这个问题的方法,并且这个示例满足您的好奇心。