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

How to find a substring of a string in an array PHP

如果你看我的很多问题,你会发现有时我没有问出最好的问题,或者我太匆忙以至于看不到就在我面前的答案全程。如果这是其中的另一个问题,请善待一些 other 人并不是最好的。现在进入正题。

在过去一周左右的时间里,我一直在创建一个文件列表查看器类型的东西。在这一点上,一切都很好,但我需要添加一个搜索功能。我通过使用 array_search() 来做到这一点。唯一的问题是此功能要求您输入文件的确切名称而不是其中的一部分。

问题来了。我尝试了很多解决方案,坦率地说,我的 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>";
    }
}
?>

目前有2000多个文件,里面有各种随机字符。这些字符的范围从破折号到感叹号再到字母和数字以及句号等等。我无法控制这些文件名,它们必须保持完全相同。

如果你看代码,我先把所有的文件名都拿到数组里,

$files

然后我检查 url,

中是否提供了搜索参数
?q=insert-search-terms-here

之后,如果提供了,我会搜索它(这是问题所在)。如果未提供,我只需从数组中获取文件名并检查它们是否为图像。如果是,我会以缩略图的形式将它们全部打印在页面底部,并将它们的 link 放在顶部的页面 link 中,让您向下滚动到图像的位置。如果它不是图像,它会将您直接带到文件。请注意,缩略图与实际图像相差 link。

当它搜索时应该发生的事情基本上是它在不搜索时会做的事情,但它仅限于包含字符串 "foobar" 的文件。

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

如果有人能对此提供帮助,我们将不胜感激。就像我一开始说的,如果是愚蠢的错误,请多多包涵。

此致, 伊曼纽尔

编辑: 这篇文章现在显然有了答案,对于那些在 Google 上找到这篇文章的人或者你有什么,我希望你阅读答案 post 中的评论以及答案,因为它们提供了关键信息! !

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)));
}

您可能想要使用 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读作"match any string ending with a dot followed by jpeg, png, jpg or gif"(美元符号可以翻译成"end of the string")

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>";
    }
}

这样的事情甚至对关联数组也有效。

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

print_r($final_Array)