0

我有一个数组中的单词列表。检查字符串中是否存在这些单词的最快方法是什么?

foreach目前,我正在通过循环逐一检查数组元素的存在stripos。我很好奇是否有更快的方法,就像我们str_replace使用数组所做的那样。

4

3 回答 3

2

关于您的附加评论,您可以使用 explode() 或preg_split()将您的字符串分解为单个单词,然后使用array_intersect()检查该数组与 needles 数组。所以所有的工作只做一次。

<?php
$haystack = "Hello Houston, we have a problem";
$haystacks = preg_split("/\b/", $haystack);
$needles = array("Chicago", "New York", "Houston");
$intersect = array_intersect($haystacks, $needles);
$count = count($intersect);

var_dump($count, $intersect);

我可以想象 array_intersect() 非常快。但这取决于您真正想要什么(匹配单词,匹配片段,..)

于 2012-05-21T22:54:36.190 回答
1

我的个人功能:

function wordsFound($haystack,$needles) {
    return preg_match('/\b('.implode('|',$needles).')\b/i',$haystack);      
}

//> Usage:
if (wordsFound('string string string',array('words')))

请注意,如果您使用 UTF-8 外来字符串,则需要将 \b 更改为 utf-8 preg 单词边界的对应关系

注意2:请务必在 $needles 中仅输入 a-z0-9 字符(感谢 MonkeyMonkey),否则您需要在preg_quote此之前输入

i注意3:由于修饰符,此函数不区分大小写

于 2012-05-21T22:33:16.540 回答
0

通常,与基本字符串函数(如str_ipos(). 但我认为这真的取决于情况。如果您真的需要最高性能,我建议您使用真实数据进行一些测试。

于 2012-05-21T22:37:49.950 回答