strpos() 与多个针?

我正在寻找一个像strpos()这样的函数,有两个显着的区别:

  1. 为了能够接受多针。我的意思是成千上万的针头。
  2. 搜索大海捞针中的所有针,并返回起始位置数组。

当然,它必须是一个有效的解决方案,而不仅仅是一个贯穿每一根针的循环。我搜索了这个论坛,有类似的问题,比如:

但是他们中的下界是我正在寻找的。我使用strpos只是为了更好地说明我的问题,可能为此目的必须使用完全不同的东西。

我知道Zend_Search_Lucene,我感兴趣的是它是否可以用来实现这一目标以及如何实现(只是一般的想法)?

非常感谢您的帮助和时间!


答案 1

尝试对多个进行 preg 匹配

if (preg_match('/word|word2/i', $str))

检查多个 strpos 值


答案 2

以下是我的策略的一些示例代码:

function strpos_array($haystack, $needles, $offset=0) {
    $matches = array();

    //Avoid the obvious: when haystack or needles are empty, return no matches
    if(empty($needles) || empty($haystack)) {
        return $matches;
    }

    $haystack = (string)$haystack; //Pre-cast non-string haystacks
    $haylen = strlen($haystack);

    //Allow negative (from end of haystack) offsets
    if($offset < 0) {
        $offset += $heylen;
    }

    //Use strpos if there is no array or only one needle
    if(!is_array($needles)) {
        $needles = array($needles);
    }

    $needles = array_unique($needles); //Not necessary if you are sure all needles are unique

    //Precalculate needle lengths to save time
    foreach($needles as &$origNeedle) {
        $origNeedle = array((string)$origNeedle, strlen($origNeedle));
    }

    //Find matches
    for(; $offset < $haylen; $offset++) {
        foreach($needles as $needle) {
            list($needle, $length) = $needle;
            if($needle == substr($haystack, $offset, $length)) {
                $matches[] = $offset;
                break;
            }
        }
    }

    return($matches);
}

我在上面实现了一个简单的蛮力方法,该方法将与针和大海捞针(不仅仅是单词)的任意组合一起使用。对于可能更快的算法,请查看:


其他解决方案

function strpos_array($haystack, $needles, $theOffset=0) {
    $matches = array();

    if(empty($haystack) || empty($needles)) {
        return $matches;
    }

    $haylen = strlen($haystack);

    if($theOffset < 0) {  // Support negative offsets
        $theOffest += $haylen;
    }

    foreach($needles as $needle) {
        $needlelen = strlen($needle);
        $offset = $theOffset;

        while(($match = strpos($haystack, $needle, $offset)) !== false) {
            $matches[] = $match;
            $offset = $match + $needlelen;
            if($offset >= $haylen) {
                break;
            }
        }
    }

    return $matches;
}

推荐