如何在PHP中搜索另一个字符串中的字符串数组?

时间:2011-06-03 14:44:35

标签: php arrays string

首先,我想告诉我,我需要的是与in_array PHP函数相反的。

我需要搜索字符串中的所有数组项,如果发现其中任何一项,函数将返回true,否则返回false。

我需要这个问题的最快解决方案,当然这可以通过迭代数组并使用strpos函数来成功。

欢迎任何建议。

示例数据:

$string = 'Alice goes to school every day';

$searchWords = array('basket','school','tree');

返回 true

$string = 'Alice goes to school every day';

$searchWords = array('basket','cat','tree');

返回 false

8 个答案:

答案 0 :(得分:10)

您应该尝试使用preg_match:

if (preg_match('/' . implode('|', $searchWords) . '/', $string)) return true;

在这里发表一些评论后,正确转义了解决方案:

function contains($string, Array $search, $caseInsensitive = false) {
    $exp = '/'
        . implode('|', array_map('preg_quote', $search))
        . ($caseInsensitive ? '/i' : '/');
    return preg_match($exp, $string) ? true : false;
}

答案 1 :(得分:3)

如果可以使用以下空格展开字符串,则可以使用:

var_dump(array_intersect(explode(' ', $str), $searchWords) != null);

输出:您提供的2个示例:

bool(true)
bool(false)

更新

如果使用空格字符无法展开字符串,则使用此类代码在任何字符结尾上拆分字符串:

var_dump(array_intersect(preg_split('~\b~', $str), $searchWords) != null);

答案 2 :(得分:3)

function searchWords($string,$words)
{
    foreach($words as $word)
    {
        if(stristr($string," " . $word . " ")) //spaces either side to force a word
        {
            return true;
        }
    }
    return false;
}

用法:

$string = 'Alice goes to school every day';
$searchWords = array('basket','cat','tree');

if(searchWords($string,$searchWords))
{
     //matches
}

另请注意,函数stristr用于使区分大小写

答案 3 :(得分:3)

根据malko的例子,但正确地逃避了这些值。

function contains( $string, array $search ) {
    return 0 !== preg_match( 
        '/' . implode( '|', preg_quote( $search, '/' ) ) . '/', 
        $string 
    );
}

答案 4 :(得分:0)

试试这个:

$string = 'Alice goes to school every day';
$words = split(" ", $string); 
$searchWords = array('basket','school','tree');

for($x = 0,$l = count($words); $x < $l;) {
        if(in_array($words[$x++], $searchWords)) {
                //....
        }
}

答案 5 :(得分:0)

关于什么是更快的问题总是存在争议所以我认为我会使用不同的方法进行一些测试。

测试运行

  1. strpos
  2. 带有foreach循环的preg_match
  3. preg_match with regex或
  4. 使用字符串索引搜索以展开
  5. 将搜索索引为数组(字符串已爆炸)
  6. 运行两组测试。一个在大型文本文档(114,350个单词)上,一个在小型文本文档上(120个单词)。在每组中,所有测试都运行100次,然后取平均值。测试没有忽略大小写,这样做会使它们更快。搜索索引的测试已预先编入索引。我编写了自己编制索引的代码,我确信它的效率较低,但是对于大文件的索引花费了17.92秒,对于小文件,需要花费0.001秒。

    搜索的条款包括:gazerbeam(文档中未找到),合法(在文档中找到)和目标(未在文档中找到)。

    以秒为单位完成单个测试的结果,按速度排序:

    大文件:

    1. 0.0000455808639526(索引未爆炸)
    2. 0.0009979915618897(preg_match使用正则表达式或)
    3. 0.0011657214164734(strpos)
    4. 0.0023632574081421(使用foreach循环的preg_match)
    5. 0.0051533532142639(爆炸指数)
    6. 小文件

      1. 0.000003724098205566(strpos)
      2. 0.000005958080291748(preg_match使用正则表达式或)
      3. 0.000012607574462891(使用foreach循环的preg_match)
      4. 0.000021204948425293(索引未爆炸)
      5. 0.000060625076293945(索引与爆炸)
      6. 请注意,对于小文件,strpos比preg_match(使用regex或)更快,但对于大文件则更慢。其他因素,例如搜索词的数量当然会影响到这一点。

        使用的算法:

        //strpos
        $str = file_get_contents('text.txt');
        $t = microtime(true);
        foreach ($search as $word) if (strpos($str, $word)) break;
        $strpos += microtime(true) - $t;
        
        //preg_match
        $str = file_get_contents('text.txt');
        $t = microtime(true);
        foreach ($search as $word) if (preg_match('/' . preg_quote($word) . '/', $str)) break;
        $pregmatch += microtime(true) - $t;
        
        //preg_match (regex or)
        $str = file_get_contents('text.txt');
        $orstr = preg_quote(implode('|', $search));
        $t = microtime(true);
        if preg_match('/' . $orstr . '/', $str) {};
        $pregmatchor += microtime(true) - $t;
        
        //index with explode
        $str = file_get_contents('textindex.txt');
        $t = microtime(true);
        $ar = explode(" ", $str);
        foreach ($search as $word) {
            $start = 0; 
            $end = count($ar);
            do {
                $diff = $end - $start;
                $pos = floor($diff / 2) + $start;
                $temp = $ar[$pos];
                if ($word < $temp) {
                    $end = $pos;
                } elseif ($word > $temp) {
                    $start = $pos + 1;
                } elseif ($temp == $word) {
                    $found = 'true';
                    break;
                }
            } while ($diff > 0);
        }
        $indexwith += microtime(true) - $t;
        
        //index without explode (already in array)
        $str = file_get_contents('textindex.txt');
        $found = 'false';
        $ar = explode(" ", $str);
        $t = microtime(true);
        foreach ($search as $word) {
            $start = 0; 
            $end = count($ar);
            do {
                $diff = $end - $start;
                $pos = floor($diff / 2) + $start;
                $temp = $ar[$pos];
                if ($word < $temp) {
                    $end = $pos;
                } elseif ($word > $temp) {
                    $start = $pos + 1;
                } elseif ($temp == $word) {
                    $found = 'true';
                    break;
                }
            } while ($diff > 0);
        }
        $indexwithout += microtime(true) - $t;
        

答案 6 :(得分:0)

以下显示在字符串中从数组中找到的元素数量的频率

function inString($str, $arr, $matches=false)
    {
        $str = explode(" ", $str);
        $c = 0;
        for($i = 0; $i<count($str); $i++)
        {
            if(in_array($str[$i], $arr) )
            {$c++;if($matches == false)break;}
        }
        return $c;
    }

答案 7 :(得分:-1)

以下链接可以帮助您:只需根据您的需要进行自定义。

Check if array element exists in string

定制:

function result_arrayInString($prdterms,208){
  if(arrayInString($prdterms,208)){
      return true;
  }else{
     return false;
  }
}

这可能对您有所帮助。