如何在数组PHP中查找字符串的子字符串

时间:2015-03-01 20:36:18

标签: php search strpos

如果你看看我的很多问题,你会发现有时我不会问最好的问题,或者我是如此匆忙,以至于我没有看到一直在我面前的答案。如果这是另外一个问题,请善待一些其他人不是最好的。现在问题。

过去一周左右,我一直在创建一个文件列表查看器类型的东西。在这一点上,它很棒,但我需要添加一个搜索功能。我是通过使用array_search()来实现的。唯一的问题是这个函数要求你输入文件的EXACT名称而不是它的一部分。

这是问题所在。我尝试了很多解决方案,坦率地说,我的PHP技能并不是最专业的。我已尝试过array_filters和带有strpos的循环。在这一点上没有任何作用。我的代码如下:

<?php
//error_reporting(0);
//ini_set('display_errors', 0);
//$dir = $_SERVER["DOCUMENT_ROOT"] . '/';
$dir = getcwd();
$files = $files = array_slice(scandir($dir), 2);
$number = count($files);
sort($files);
$images = array();
$an = count($images);
$query = $_GET['q'];
$searchimages = array();
$san = count($searchimages);
$r = array();

if ($query) {
    for ($w = 0; $w <= $number; $w++){
        $rnum = count($r);
        if (strpos($files[$w], $query) !== false) {
            $r[$rnum++] = $files[$w];
        }
    }

    if ($r != null) {
        if (substr($files[$r], -5) == ".jpeg" || substr($files[$r], -4) == ".png" || substr($files[$r], -4) == ".jpg" || substr($files[$r], -4) == ".gif") {
            $searchimages[$san++] = $files[$r];
            echo "<a href='#" . $files[$r] . "'>" . $files[$r] . "</a><br>";
        } else {
            echo "<a href='" . $files[$r] . "'>" . $files[$r] . "</a><br>";
        }

        for ($z = 0; $z <= $san; $z++)
        echo "<a name='" . $searchimages[$z] . "'>" . "<a href='" . $searchimages[$z] . "' target='_blank'>" . "<img src='" . $searchimages[$z] . "'>" . "</img></a>";
    } else {
        echo "No results found. Please try a different search" . "<br>";
    }
} else {
    for ($x = 0; $x <= $number; $x++) {
        if (substr($files[$x], -5) == ".jpeg" || substr($files[$x], -4) == ".png" || substr($files[$x], -4) == ".jpg" || substr($files[$x], -4) == ".gif") {
            $images[$an++] = $files[$x];
            echo "<a href='#" . $files[$x] . "'>" . $files[$x] . "</a><br>";
        } else {
            echo "<a href='" . $files[$x] . "'>" . $files[$x] . "</a><br>";
        }
    }

    for ($y = 0; $y <= $an; $y++) {
        echo "<a name='" . $images[$y] . "'>" . "<a href='" . $images[$y] . "' target='_blank'>" . "<img src='" . $images[$y] . "'>" . "</img></a>";
    }
}
?>

目前有超过2,000个文件,它们中包含各种随机字符。这些字符包括破折号,感叹号,字母和数字以及句号等等。我无法控制这些文件名,它们必须保持完全相同。

如果查看代码,我首先获取所有文件名并将它们存储在一个数组中,

$files

然后我检查是否在网址中提供了搜索参数

?q=insert-search-terms-here

之后,如果它被提供,我将搜索它(这是问题所在)。如果没有提供,我只需从数组中获取文件名并检查它们是否是图像。如果是这样的话,我会以缩略图的形式将它们全部打印在页面底部,并在顶部创建一个页面链接链接,将您向下滚动到图像的位置。如果它不是图像,则会直接转到该文件。请注意,缩略图是指向实际图像的链接。

在搜索时应该发生的事情基本上是在它没有搜索的情况下会做什么,但它将自己限制为包含字符串“foobar”的文件。

当它搜索但没有找到任何内容时,会打印出它没有找到任何内容并且用户应该再次搜索。

如果有人可以提供帮助,我们将不胜感激。就像我刚开始说的那样,如果它是一个愚蠢的错误,请善待。

最诚挚的问候, 以马内利

修改: 这篇文章现在显然有一个答案,对于那些在Google上发现这篇文章的人或者你有什么,我希望你阅读答案帖子中的评论以及答案,因为他们提供了关键信息!!

3 个答案:

答案 0 :(得分:0)

http://www.wordinn.com/solution/108/php-getting-part-string-after-and-given-sub-string-or-character 这可能会有所帮助..

function strafter($string, $substring) {
  $pos = strpos($string, $substring);
  if ($pos === false)
   return $string;
  else 
   return(substr($string, $pos+strlen($substring)));
}

答案 1 :(得分:0)

您可能想要使用preg_grep。替换这个:

for ($w = 0; $w <= $number; $w++){
    $rnum = count($r);
    if (strpos($files[$w], $query) !== false) {
        $r[$rnum++] = $files[$w];
    }
}

用这个:

$r = preg_grep('/\Q' . $query . '\E/', $files);

示例:

$files = array(
    'foo.bar',
    'barfoo.baz',
    'baz.fez',
    'quantum-physics.ftw',
);

$query = 'foo';

$r = preg_grep('/\Q' . $query . '\E/', $files);

print_r($r);

输出:

Array
(
    [0] => foo.bar
    [1] => barfoo.baz
)

下面的preg_match可以读取“匹配任何以点结尾的字符串,后跟jpeg,png,jpg或gif”(美元符号可以翻译成“字符串的结尾”)。

if ($query) {
    $r = preg_grep('/\Q' . $query . '\E/', $files);

    if ($r != null) {
        foreach($r as $filename) {
            if (preg_match('/\.(jpeg|png|jpg|gif)$/', $filename)) {
                // File is an image
                echo "$filename is an image<br/>";
                // Do stuff ...
            } else {
                // File is not an image
                echo "$filename is NOT an image<br/>";
                // Do stuff ...
            }
        }
        // ... Do more
    } else {
        echo "No results found. Please try a different search" . "<br>";
    }
}

答案 2 :(得分:0)

这样的东西甚至适用于关联数组。

foreach ($members as  $user){
  $Match = substr($user['column'][0], strpos($user['column'][0], "#") + 1);
  $final_Array[$i]=$Match;
   $i++;
 }

print_r($final_Array)