1

这与在字符串中查找子字符串的所有位置略有不同,因为我希望它可以处理后跟空格、逗号、分号、冒号、句号、感叹号和其他标点符号的单词。

我有以下函数来查找子字符串的所有位置:

function strallpos($haystack,$needle,$offset = 0){ 
    $result = array(); 
    for($i = $offset; $i<strlen($haystack); $i++){ 
        $pos = strpos($haystack,$needle,$i); 
        if($pos !== FALSE){ 
            $offset =  $pos; 
            if($offset >= $i){ 
                $i = $offset; 
                $result[] = $offset; 
            } 
        } 
    } 
    return $result; 
}

问题是,如果我尝试查找子字符串“us”的所有位置,它将返回“招股说明书”或“包容性”等中出现的位置。

有什么办法可以防止这种情况发生吗?可能使用正则表达式?

谢谢。斯特凡

4

2 回答 2

7

您可以使用 preg_match_all 捕获偏移量:

$str = "Problem is, if I try to find all positions of the substring us, it will return positions of the occurrence in prospectus or inclusive us us";
preg_match_all('/\bus\b/', $str, $m, PREG_OFFSET_CAPTURE);
print_r($m);

输出:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => us
                    [1] => 60
                )
            [1] => Array
                (
                    [0] => us
                    [1] => 134
                )
            [2] => Array
                (
                    [0] => us
                    [1] => 137
                )
        )
)
于 2013-08-19T14:14:16.090 回答
1

只是为了演示一个非正则表达式替代品

$string = "It behooves us all to offer the prospectus for our inclusive syllabus";
$filterword = 'us';

$filtered = array_filter(
    str_word_count($string,2),
    function($word) use($filterword) {
        return $word == $filterword;
    }
);
var_dump($filtered);

$filtered 的键是偏移位置

如果要不区分大小写,请替换

return $word == $filterword;

return strtolower($word) == strtolower($filterword);
于 2013-08-19T14:22:08.867 回答