Ajax搜索POST到php

时间:2017-11-11 10:07:40

标签: php ajax

我需要一些帮助来完善我当前的搜索。

我的文件夹名为:

20171116-category_title.jpg       (where first number is date yyyymmdd)

我目前的搜索结果如下:

<?php
// string to search in a filename.

if(isset($_POST['question'])){
    $searchString = $_POST['question'];
}
// image files in my/dir
$imagesDir = '';
$files = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);

// array populated with files found 
// containing the search string.
$filesFound = array();

// iterate through the files and determine 
// if the filename contains the search string.
foreach($files as $file) {
    $name = pathinfo($file, PATHINFO_FILENAME);

    // determines if the search string is in the filename.
    if(strpos(strtolower($name), strtolower($searchString))) {
         $filesFound[] = $file;
    } 
}

// output the results.
echo json_encode($filesFound, JSON_UNESCAPED_UNICODE);
?>

这很好但是......

  1. 我想将搜索限制为仅包含下划线“_”后面的“title”的.jpg名称的一部分,之后(如果可能)将搜索扩展到:

  2. 如果AJAX POST发送以下格式,则进行双重搜索:abc + xyz其中分隔符“+”实际意味着2个查询。

    第一部分是(abc),其目标是“类别”,它位于减号和下划线之间,第二部分是查询(xyz)(这基本上是我的第一个问题),仅限于之前找到的(类别)答案。

    非常欢迎您的提示! 谢谢!

1 个答案:

答案 0 :(得分:0)

对于问题的第一部分,您使用的确切模式取决于category字符串的格式。如果_中永远不会有category下划线,那么这是一个解决方案:

foreach($files as $file) {
    // $name = "20171116-category_title"
    $name = pathinfo($file, PATHINFO_FILENAME);

    // $title = "title", assuming your categories will never have "_".
    // The regular expression matches 8 digits, followed by a hyphen, 
    // followed by anything except an underscore, followed by an 
    // underscore, followed by anything
    $title = preg_filter('/\d{8}-[^_]+_(.+)/', '$1', $name);

    // Now search based on your $title, not $name
    // *NOTE* this test is not safe, see update below.
    if(strpos(strtolower($title), strtolower($searchString))) {

如果您的类别可以或将会有下划线,则需要根据您可以确定的某种格式调整正则表达式。

对于第二个问题,您需要先将查询分成可寻址的部分。请注意+通常是如何在URL中编码空格,因此将其用作分隔符意味着您将永远无法使用带空格的搜索项。也许这对你来说不是问题,但如果它是你应该尝试另一个分隔符,或者更简单的是使用单独的搜索字段,例如你的搜索表单上的2个输入。

无论如何,使用+

if(isset($_POST['question'])){
    // $query will be an array with 0 => category term, and 1 => title term
    $query = explode('+', $_POST['question']);
}

现在,在循环中,您不仅需要识别文件名的$title部分,还需要识别$category

$category = preg_filter('/\d{8}-([^_]+)_.+/', '$1', $name);
$title = preg_filter('/\d{8}-[^_]+_(.+)/', '$1', $name);

一旦你有了这些,你可以在最后的测试中使用它们来匹配:

if( strpos(strtolower($category), strtolower($query[0])) && strpos(strtolower($title), strtolower($query[1])) ) {

<强>更新

我刚注意到你的匹配测试有问题。如果从位置strpos开始找到匹配项,则0可以返回00是一个假结果,这意味着即使匹配,您的测试也会失败。您需要在FALSEas described in the docs上明确测试:

if( strpos(strtolower($category), strtolower($query[0])) !== FALSE 
    && strpos(strtolower($title), strtolower($query[1])) !== FALSE ) {