如果你需要所有的偏移量,也可以使用preg_match_all函数和标志PREG_OFFSET_CAPTURE
if(preg_match_all('/'.implode('|', $a).'/', $str, $out, PREG_OFFSET_CAPTURE))
print_r($out[0]);
如果您需要匹配 \b word boundaries 或使用 i flag 进行无大小写匹配,则很有用。
正如@mike.k 评论的那样:如果$a 包含characters with special meaning inside a regex pattern,则需要先转义:array_map(function ($v) { return preg_quote($v, "/"); }, $a)
要获得最接近开始的那个,不需要所有偏移量。可以使用 preg_match 和 simple 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];
最接近 start 的子字符串是偏移 4 处的“2str”
如果你根本不需要偏移量/正则表达式,第一个匹配的另一个想法:使用usort by pos 排序
usort($a, function ($x, $y) use (&$str) {
return (strpos($str, $x) < strpos($str, $y)) ? -1 : 1;
});
echo $a[0]; > 2str (使用 usort 的匿名函数至少需要 PHP 5.3)