如何使用PHP(无MySQL)在html表中恢复过滤后的行

如何使用PHP(无MySQL)在html表中恢复过滤后的行,php,html,Php,Html,在我的html中,我有一个搜索函数,当单击submit按钮时,会运行一个PHP函数,该函数将筛选出不包含搜索词的行,并且只在html表中包含搜索词的行显示在页面上。我的HTML表是使用PHP生成的,PHP从.txt文件中读取书籍。我的代码从文本文件中返回行,而不是过滤表结果。需要帮忙吗 HTML 如果看不到$books或者甚至看不到$book的样子,似乎每次搜索都会因为以下原因而失败: $book\u formatted=substr($book\u formatted,0,$pos) 如果你的

在我的html中,我有一个搜索函数,当单击submit按钮时,会运行一个PHP函数,该函数将筛选出不包含搜索词的行,并且只在html表中包含搜索词的行显示在页面上。我的HTML表是使用PHP生成的,PHP从.txt文件中读取书籍。我的代码从文本文件中返回行,而不是过滤表结果。需要帮忙吗

HTML


如果看不到
$books
或者甚至看不到
$book
的样子,似乎每次搜索都会因为以下原因而失败:

$book\u formatted=substr($book\u formatted,0,$pos)

如果你的书是“ABC书”,你的搜索是“Bo”,第一个stripos会给你一个结果4,这不是假的,所以它会移动到你的else部分。但是,然后您再次将图书名称分为子字符串,将名称切割为“ABC”,然后执行另一次搜索“Bo”,这通常会失败

也许你是想得到搜索词和它之后的一切?那样的话,就用

$book\u formatted=substr($book\u formatted,$pos)

它将返回“Book”。在这种情况下,第二次搜索没有意义,因为它总是返回0。除非没有提供更多内容,否则如果您只是按照自己的意愿格式化书名,并在第一个else语句中打印,而不是在第二个stripos语句中打印,就应该可以了

编辑:

在页面的某个地方,可能有一个循环在打印表行:

foreach($books as $book){
    ...
    print "<tr><td>" . $book . "</td></tr>";
    ...
}
foreach($book作为$book){
...
打印“$book.”;
...
}
基本上把所有代码复制到打印行周围的循环中,如下所示

 $search_term = $_POST['search_term'];
 ...
 // this should be the loop on your page that is printing the contents of the table
 foreach($books as $book){

     ...

     $book_formatted = str_replace('|', '', $book);
     $pos = stripos($book_formatted, $search_term);       
     if($search_term == "" || $pos !== false) {
          // this should be whatever line, or group of lines, that is printing the table rows
          print "<tr><td>" . $book_formatted. "</td></tr>";
     }
 }
$search\u term=$\u POST['search\u term'];
...
//这应该是页面上打印表内容的循环
foreach($books作为$book){
...
$book_formatted=str_replace(“|”),“$book”;
$pos=stripos($book\u formatted,$search\u term);
如果($search_term==“”| |$pos!==false){
//这应该是打印表行的任何行或行组
打印“$book_格式”;
}
}

需要注意的是,只有当$search\u term不为空时,搜索位置才重要。这样,如果您不进行搜索,所有行都会显示。

如果没有实际查看
$books
或甚至
$book
的外观,似乎每次搜索都会失败,因为:

$book\u formatted=substr($book\u formatted,0,$pos)

如果你的书是“ABC书”,你的搜索是“Bo”,第一个stripos会给你一个结果4,这不是假的,所以它会移动到你的else部分。但是,然后您再次将图书名称分为子字符串,将名称切割为“ABC”,然后执行另一次搜索“Bo”,这通常会失败

也许你是想得到搜索词和它之后的一切?那样的话,就用

$book\u formatted=substr($book\u formatted,$pos)

它将返回“Book”。在这种情况下,第二次搜索没有意义,因为它总是返回0。除非没有提供更多内容,否则如果您只是按照自己的意愿格式化书名,并在第一个else语句中打印,而不是在第二个stripos语句中打印,就应该可以了

编辑:

在页面的某个地方,可能有一个循环在打印表行:

foreach($books as $book){
    ...
    print "<tr><td>" . $book . "</td></tr>";
    ...
}
foreach($book作为$book){
...
打印“$book.”;
...
}
基本上把所有代码复制到打印行周围的循环中,如下所示

 $search_term = $_POST['search_term'];
 ...
 // this should be the loop on your page that is printing the contents of the table
 foreach($books as $book){

     ...

     $book_formatted = str_replace('|', '', $book);
     $pos = stripos($book_formatted, $search_term);       
     if($search_term == "" || $pos !== false) {
          // this should be whatever line, or group of lines, that is printing the table rows
          print "<tr><td>" . $book_formatted. "</td></tr>";
     }
 }
$search\u term=$\u POST['search\u term'];
...
//这应该是页面上打印表内容的循环
foreach($books作为$book){
...
$book_formatted=str_replace(“|”),“$book”;
$pos=stripos($book\u formatted,$search\u term);
如果($search_term==“”| |$pos!==false){
//这应该是打印表行的任何行或行组
打印“$book_格式”;
}
}

需要注意的是,搜索位置仅在$search\u term不为空时才重要,这样,如果您不进行搜索,所有行都将显示。

对不起,books是一个数组,其中有20本不同的书籍从文本文件返回。它们都以一个名为$books的数组返回。我使用了您的建议,即只使用“$book_formatted=substr($book_formatted,$pos);”,并且部分有效。它确实带回了我正在寻找的正确字符串(取决于我的搜索),但它是从.txt表单带回的,而不是过滤我的html表。还有什么建议吗?我假设页面上有一个循环,在书籍中循环并打印html表行。您基本上必须将其与上面的代码合并。所以在循环中检查是否有搜索和匹配,然后它将打印该行。我会尝试在答案中添加一些东西。是的,我确实有一个输出html表的循环。谢谢Stephen,我添加了以下代码,但它重复了带回来的$book_格式,并将其作为新行放在我的每本书下面。它不过滤。有什么帮助吗?在这个循环中,检查每一行是否应该显示,然后在if语句中,分解文本文件,并执行任何需要执行的操作来回显该行。对不起,books是一个数组,其中有20个不同的书籍从一个文本文件返回。它们都以一个名为$books的数组返回。我使用了您的建议,即只使用“$book_formatted=substr($book_formatted,$pos);”,并且部分有效。它确实带回了我正在寻找的正确字符串(取决于我的搜索),但它是从.txt表单带回的,而不是过滤我的html表。还有什么建议吗?我假设页面上有一个循环,在书籍中循环并打印html表行。你会打电话的