0

我正在编写一些代码,需要在字符串中搜索某种符号。我为此使用 mb_strpos 函数,它适用于字母符号,但如果我搜索问号、点等符号,则它不起作用。例如,如果我在字符串 mb_strpos 中搜索“aaaaa”(或任何其他 unicode 字符)按预期工作,但如果我搜索“??????” 它没有!

这是我的代码:

function symbols_in_row($string, $limit=5) {
    //split string by characters and generate new array containing each character
    $symbol = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
    //remove duplicate symbols from array
    $unique = array_unique($symbol);
    //generate combination of symbols and search for them in string
    for($x=0; $x<=count($unique); $x++) {
        //generate combination of symbols
        for($c=1; $c<=$limit; $c++) {
            $combination .= $unique[$x];
        }
        //search for this combination of symbols in given string
        $pos = mb_strpos($string, $combination);
        if ($pos !== false) return false;
    }
    return true;
}

在第二种情况下它总是返回 true!

有人可以帮忙吗?

4

2 回答 2

1

好吧,我可以建议以不同的方式进行吗?

function symbolsInRow($string, $limit = 5) {
    $regex = '/(.)\1{'.($limit - 1).',}/us';
    return 0 == preg_match($regex, $string);
}

所以基本上它只是查看$limit连续(或更多)重复的任何字符。如果找到,则返回false. 否则它会返回true...

于 2010-11-13T15:14:24.270 回答
1

你可以用一个简单的正则表达式来做到这一点:

<pre>
<?php 

$str="Lorem ipsum ?????? dolor sit amet xxxxx ? consectetuer faucibus.";
preg_match_all('@(.)\1{4,}@s',$str,$out);
print_r($out);
?>
</pre>

解释表达式:

(.)匹配每个字符并创建对它的引用
\1使用此引用
{4,}引用必须出现 4 次或更多次(因此使用这 4 个字符和引用本身,您将匹配 5 个相同的字符)

于 2010-11-13T15:20:00.050 回答