首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑PHP代码以使用strpos查找是否大和Needle1在文件名中

编辑PHP代码以使用strpos查找是否大和Needle1在文件名中
EN

Stack Overflow用户
提问于 2019-09-07 16:14:59
回答 2查看 73关注 0票数 0

抱歉,我在标题和问题上搞砸了,我相信现在两者都是固定的。看起来我在找“或”,而我在找“和”。

我在一个文件夹中有几个文件:

this-is-big-needle1.jpg

a-big-long-needle1.jpg

this-file-is-needle2.jpg

needle3-is-this-file.jpg

当前的代码&& strpos($file,"needle1")用于搜索一个文件夹,并嵌入所有与strops值(如"needle1“)匹配的文件,并将这些图像包含在AMP HTML旋转木马中。

因此,当前代码搜索"needle1“,并将正确返回前面的2个文件,但忽略其他文件。

我搜索并找到了几种通用的解决方案,用于查找文件名中是否存在needle1或needle2,但是发现没有任何东西是“大”的,"needle1“也在同一个文件名中。

我尝试过添加第二个strops && strpos($file,"needle1")和& strpos($file,"big"),但是我的php技巧非常缺乏,所以很容易被语法绊倒,并将其放入“.”等

代码语言:javascript
复制
php
$Count5Image5 = 0;
$Image5;
$handle = opendir(dirname(realpath(__FILE__)).'/images/');
while($file = readdir($handle)){

    if($file !== '.' && $file !== '..' && strpos($file,"needle1")) 
{
        Image5[$Count5Image5] = $file;
        $Count5Image5++;
    }
}
sort($Image5);
for($i=0; $i<$Count5Image5; $i++)
  echo '<amp-img src="images/'.$Image5[$i].'" class="xs-12" width="353" height="210" layout="responsive"></amp-img>';
?>

如果有人建议编辑我的代码,以便在同一个文件名中找到"needle1“(返回前两个文件),我们将不胜感激。

==========一个小问题(如果有明显的解决方案)-由于某种原因,在文件名开始时,现有代码将找不到任何文件(如输入值“this”),它将找不到任何文件,或者如果输入needle3,它将找不到任何文件(字符串中的字符串必须在character1之后)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-07 16:19:07

也许你可以替换:

代码语言:javascript
复制
if($file !== '.' && $file !== '..' && strpos($file,"needle1"))

通过以下方式:

代码语言:javascript
复制
if($file !== '.' && $file !== '..' && ( strpos($file,"needle1") !== false || strpos($file,"needle2") !== false )

这将匹配名称中包含needle1或needle2的所有文件。

请注意我在每个!== false之后添加的strpos()。这有助于你解决你提到的附带问题。如果找不到针,strpos返回false,如果文件名以指针开头,则返回0。它们在if语句上下文中都被计算为false (您可以读取更多的这里 )。

Preg_match alternative

这将是匹配bigneedle的另一种很好的方法,无论它们在文件名中的出现顺序如何。

代码语言:javascript
复制
if(preg_match("/(big|needle1)/i", $file) !== 0) {

} 

这两者都匹配:this-is-big-needle1.jpgthis-needle1-is-big.jpg,如下所示:正则试验

替代

另一种很好的方法是使用glob()函数:

这样,您只能获得与这些文件名匹配的文件:

代码语言:javascript
复制
foreach (glob("{*needle1*,*needle2*}.*", GLOB_BRACE) as $filename) {
    echo $filename."<br />";
}

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2019-09-07 17:16:55

你遇到的问题是手动引用,

此函数可能返回布尔值FALSE,但也可能返回计算为FALSE的非布尔值。有关更多信息,请阅读有关布尔人的部分。使用===操作符测试此函数的返回值。

-https://www.php.net/manual/en/function.strpos.php

因此,您应该使用!==进行比较。

但是,由于您正在进行模式匹配,所以我将只对preg_match使用正则表达式。

代码语言:javascript
复制
preg_match('/needle[12]/', $file)

[]是一个字符类,允许其中列出的所有字符,但有一些例外,是https://www.regular-expressions.info/charclass.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57835441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档