102

搜索字符串时如何使用strpos指针数组?例如:

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpos($string, $find_letters) !== false)
{
    echo 'All the letters are found in the string!';
}

因为用这个的时候就不行了,要是有这样的就好了

4

16 回答 16

153

@Dave 来自http://www.php.net/manual/en/function.strpos.php#107351的更新片段

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}

如何使用:

$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');

if (strposa($string, $array, 1)) {
    echo 'true';
} else {
    echo 'false';
}

会回来true,因为array "cheese"

更新:改进的代码在找到第一根针时停止:

function strposa(string $haystack, array $needles, int $offset = 0): bool 
{
    foreach($needles as $needle) {
        if(strpos($haystack, $query, $offset) !== false) {
            return true; // stop on first true result
        }
    }

    return false;
}
$string = 'This string contains word "cheese" and "tea".';
$array  = ['burger', 'melon', 'cheese', 'milk'];
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
于 2012-02-09T23:32:27.287 回答
75

str_replace 要快得多。

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
于 2017-02-18T06:10:18.353 回答
20

下面的代码不仅展示了如何做到这一点,而且还把它放在一个易于使用的函数中。它是由“jesda”编写的。(我在网上找到的)

PHP代码:

<?php
/* strpos that takes an array of values to match against a string
 * note the stupid argument order (to match strpos)
 */
function strpos_arr($haystack, $needle) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $what) {
        if(($pos = strpos($haystack, $what))!==false) return $pos;
    }
    return false;
}
?>

用法:

$needle = array('something','nothing');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True

$haystack = "This isn't anything";
echo strpos_arr($haystack, $needle); // Will echo False 
于 2011-06-08T20:08:19.340 回答
8

问题是,提供的示例只是“示例”还是您正在寻找的确切内容?这里有很多混合的答案,我不明白接受的答案的复杂性。

要找出字符串中是否存在针数组的任何内容,并快速返回 true 或 false:

$string = 'abcdefg';

if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
    echo 'at least one of the needles where found';
};

如果是这样,请为此给予@Leon功劳。

找出字符串中是否存在针数组的所有值,在这种情况下,所有三个和必须存在,就像你提到的“例如”'a', 'b''c'

echo '所有字母都在字符串中!';

这里的许多答案都超出了这种背景,但我怀疑您标记为已解决的问题的内涵。例如,接受的答案是针

$array  = array('burger', 'melon', 'cheese', 'milk');

如果必须在字符串中找到所有这些单词怎么办?

"not accepted answers"然后你在这个页面上尝试一些。

于 2017-09-19T06:49:53.463 回答
7

strpos如果返回,您可以遍历数组并设置“标志”值false

$flag = false;
foreach ($find_letters as $letter)
{
    if (strpos($string, $letter) === false)
    {
        $flag = true;
    }
}

然后检查 的值$flag

于 2011-06-08T20:07:43.553 回答
5

如果您只想检查某些字符是否确实在字符串中,请使用strtok

$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
    // not found
} else {
    // found
}
于 2011-06-08T20:18:44.433 回答
4

此表达式搜索所有字母:

count(array_filter( 
    array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
于 2011-06-08T20:16:30.773 回答
3

你可以试试这个:

function in_array_strpos($word, $array){

foreach($array as $a){

    if (strpos($word,$a) !== false) {
        return true;
    }
}

return false;
}
于 2016-04-18T04:05:31.527 回答
1

您也可以尝试使用strpbrk()进行否定(未找到任何字母):

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpbrk($string, implode($find_letters)) === false)
{
    echo 'None of these letters are found in the string!';
}
于 2017-01-06T17:41:38.253 回答
1

这是我的方法。遍历字符串中的字符,直到找到匹配项。在更大的针头阵列上,这将优于接受的答案,因为它不需要检查每根针头来确定已找到匹配项。

function strpos_array($haystack, $needles = [], $offset = 0) {
    for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
        if (in_array($haystack[$i],$needles)) {
            return $i;
        }
    }
    return false;
}

我将此与接受的答案进行了基准测试,并且使用超过 7 个的数组,$needles大大加快了速度。

于 2018-04-27T03:16:31.353 回答
0

使用以下代码:

$flag = true;
foreach($find_letters as $letter)
    if(false===strpos($string, $letter)) {
        $flag = false; 
        break;
    }

然后检查 的值$flag。如果是true,则已找到所有字母。如果不是,那就是false

于 2011-06-08T20:46:04.257 回答
0

我正在写一个新的答案,希望能帮助任何寻找与我相似的人。

这适用于“我有多根针并且我正在尝试使用它们来找到一个单独的字符串”的情况。这就是我遇到的问题。

    $i = 0;
    $found = array();
    while ($i < count($needle)) {
        $x = 0;
        while ($x < count($haystack)) {
            if (strpos($haystack[$x], $needle[$i]) !== false) {
                array_push($found, $haystack[$x]);
            }
            $x++;
        }
        $i++;
    }

    $found = array_count_values($found);

该数组$found将包含所有匹配针的列表,具有最高计数值的数组项将是您要查找的字符串,您可以通过以下方式获得:

print_r(array_search(max($found), $found));
于 2016-11-04T21:20:26.957 回答
0

回复@binyamin 和@Timo ..(添加评论的点数不足..)但结果不包含位置..
下面的代码将返回第一个元素的实际位置,这是 strpos 的意图做。如果您希望准确找到 1 个匹配项,这将很有用。如果您希望找到多个匹配项,那么第一个找到的位置可能毫无意义。

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
      $res=strpos($haystack, $query, $offset);
      if($res !== false) return $res; // stop on first true result
    }
    return false;
}
于 2017-11-14T22:15:28.623 回答
0

只是上述答案的升级

function strsearch($findme, $source){
    if(is_array($findme)){
        if(str_replace($findme, '', $source) != $source){
            return true;
        }
    }else{
        if(strpos($source,$findme)){
            return true;
        }
    }
    return false;
}
于 2018-05-15T16:57:54.513 回答
0
<?php
$Words = array("hello","there","world");
$c = 0;

    $message = 'Hi hello';
     foreach ($Words as $word):
        $trial = stripos($message,$word);
        
        if($trial != true){
            $c++;
            echo 'Word '.$c.' didnt match <br> <br>';
        }else{
            $c++;
            echo 'Word '.$c.' matched <br> <br>';
        }
     endforeach;
     ?>

我用这种代码来检查你好,它也有编号功能。如果您想在需要用户输入的网站中进行内容审核实践,您可以使用它

于 2021-01-01T18:57:48.967 回答
0

如果我只是想找出大海捞针中是否存在任何针,我使用

可重用函数

function strposar($arrayOfNeedles, $haystack){
  if (count(array_filter($arrayOfNeedles, function($needle) use($haystack){
     return strpos($haystack, $needle) !== false;
   })) > 0){
    return true;
  } else {
    return false;
  }
}

strposar($arrayOfNeedles, $haystack); //returns true/false

或 lambda 函数

  if (count(array_filter($arrayOfNeedles, function($needle) use($haystack){
     return strpos($haystack, $needle) !== false;
   })) > 0){
     //found so do this
   } else {
     //not found do this instead
   }
于 2021-06-02T12:04:16.763 回答