在字符串中查找多个子字符串匹配项的最佳方法?
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_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];
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)
我有 $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_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];
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)