поиск символов в строке - PullRequest
0 голосов
/ 13 ноября 2010

Я пишу некоторый код, и мне нужно искать символы в строке. Для этого я использую функцию mb_strpos, и она работает для символов алфавита, но не работает, если я ищу символы, такие как знак вопроса, точки и т. Д. Например, если я ищу «aaaaa» (или любой другой символ Unicode) в строке mb_strpos работает как положено, но если я ищу "?????" это не так!

Это мой код:

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!

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 13 ноября 2010

Вы можете сделать это с помощью простого regExp:

<code><pre>
<?php 

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

Чтобы объяснить выражение:

(.) соответствует каждому символу и создает ссылку на него
\1 использует эту ссылку
{4,} ссылка должна встречаться 4 раза или более (поэтому с этими 4 символами и самой ссылкой вы будете сопоставлять 5 одинаковых символов)

1 голос
/ 13 ноября 2010

Хорошо, могу я предложить сделать это по-другому?

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

Так что в основном он просто смотрит на любой символ, повторенный $limit раз подряд (или больше). Если он находит, он возвращает false. В противном случае возвращается true ...

...