Php 像查询数据库一样查询外部文件

Php 像查询数据库一样查询外部文件,php,html,mysql,Php,Html,Mysql,我有一个用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>

我有一个用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>
返回类别和流派


谢谢大家的时间和帮助。

我会在序言中说,所有鼓励您不要这样做的评论都是正确的。您应该在数据库中执行此操作。说真的,不要这样做

但是。。。如果我假装不涉及数据库,而我们只是尝试像数据库一样解析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”,它将返回带有子列表的
  • 元素。如果您对“类型2”进行查询,您将获得每个类别的
  • 元素,因为您的示例中的每个类别都包含一个“类型2”项,我认为这就是您正在寻找的行为

    显然,这是一个客户端解决方案,如果您试图在服务器上使用cron作业之类的东西来实现这一点,那么这可能没有帮助。看起来您正在使用基于标记的PHP。非常方便的是,有一个很好的库,名为“基于jQuery”,我们可以很容易地将其转换为:

        $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;
          }  
        }
    
    FWIW的Github版本的phpQuery似乎比谷歌代码版本早了大约2年。
    ->parents()
    方法似乎不在Google代码站点的示例中,因此我不确定它是否受支持,但它可以与Github版本一起使用


    所以。。。我希望您能从数据库中找到解决这个问题的方法,并且这个例子能满足您的好奇心

    为什么不能在原始数据上运行mysql搜索?你说它首先是由mysql生成的?最初的mysql搜索使用SELECT DISTINCT(类别),然后是每个类别的DISTINCT(流派)。其想法是将其用作更轻的类别搜索功能。(希望更快、更高效?)因此,真正的答案只是将结果“缓存”在某个地方,并重用它。当数据库中有HTML列表数据可用时,请不要尝试“搜索”HTML列表数据。“希望更快、更高效?”-如果您尝试通过您的“将要”文件进行搜索,答案是“否”和“否”。是的,这听起来像是正确的重定向。有关于从哪里开始的建议吗?在缓存结果上运行搜索?感谢您的精彩回复。有时候,知道错误的做事方式是好的,而了解更好的做事方式是好的。很好的建议。
        $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;
          }  
        }