在字符串中查找多个子字符串匹配项的最佳方法?

Best way to find matches of several substrings in string?

我有 $a=array('1str','2str','3str')$str ='123 2str 3str 1str'
并尝试做一件简单的事情 - 在 $str.

中找到 $a 的每个项目的位置

使用循环和 strpos 很容易完成,但我很好奇获得位置的最佳(实际上是简短)方法是什么?

实际上我需要在字符串 (2str)

中找到最接近的找到的项目

你可以用 array_map()

这样做
$a = array('1str', '2str', '3str');
$str ='123 2str 3str 1str';

function my_strpos($needle) {
    global $str;
    return strpos($str, $needle);
}

$positions = array_map('my_strpos', $a);

print_r($positions); 给出:

Array
(
    [0] => 14
    [1] => 4
    [2] => 9
)

如果你需要所有偏移量,也可以使用 preg_match_all 函数和标记 PREG_OFFSET_CAPTURE

if(preg_match_all('/'.implode('|', $a).'/', $str, $out, PREG_OFFSET_CAPTURE))
  print_r($out[0]);

如果需要匹配 \b word boundaries or do caseless matching using the i flag.

时很有用

如@mike.k评论:如果$a包含characters with special meaning inside a regex pattern,需要先转义那些:array_map(function ($v) { return preg_quote($v, "/"); }, $a)


要获得最接近开始的那个,不需要所有偏移量。可以用 preg_matchsimple pattern 1str|2str|3str (see test at eval.in).

if(preg_match('/'.implode('|', $a).'/', $str, $out, PREG_OFFSET_CAPTURE))
  echo "The substring that's closest to start is \"".$out[0][0]."\" at offset ".$out[0][1];

The substring that's closest to start is "2str" at offset 4


如果您根本不需要 offset/regex,第一个匹配的另一个想法:按 pos

usort 进行排序
usort($a, function ($x, $y) use (&$str) {
  return (strpos($str, $x) < strpos($str, $y)) ? -1 : 1;
});

echo $a[0]; > 2str(使用 usort 的匿名函数至少需要 PHP 5.3