使用PHP搜索带有数组值的字符串

Pat*_*ick 4 php regex

我正在尝试搜索文件列表,并仅对名称包含数组中的几个值的文件执行工作.我希望每次有新文件名时都不必遍历数组.
翼-

$needle = array('blah', 'bleh');
foreach($file_list as $file)
{
    foreach($needle as $need)
       if(strstr($file, $need) !== false)
          {
             // do something...
          }
}
Run Code Online (Sandbox Code Playgroud)

我只需要知道数组中的一个字符串是否在文件名中,而不是字符串的位置.

我想使用类似的东西,strstr()但它不允许使用数组作为针.

即 -

if(strstr($haystack, array('blah', 'bleh')))
{
   // do something...
}
Run Code Online (Sandbox Code Playgroud)

我宁愿远离正规表达,似乎是锤子工作的雪橇.有任何想法吗?

Fel*_*ing 7

IMO可以在这里使用正则表达式:

$pattern  = '/' . implode('|', array_map('preg_quote', $needle)) . '/i';

foreach($file_list as $file) {
    if(preg_match($pattern, $file)) {
    // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

参考: preg_quote


这是一种更"创造性"的方法(但它使用内部循环并且很可能更慢,因为您实际上在数组上循环了几次):

function cstrstr($haystack, $needle) {
    return strstr($haystack, $needle) !== false;
}

foreach($file_list as $file) {
    if(array_sum(array_map('cstrstr', 
                       array_pad(array($file), count($needle), $file), 
                       $needle))) {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

但正则表达式的优点应该是显而易见的:你必须只创建一次模式,而在"有趣"的解决方案中,你总是需要count($needle)为每个创建一个长度数组$file.