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;
}

2番目のケースでは常に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 に答える