Какой самый быстрый способ проверить количество определенных символов в строке в PHP?

Так что мне нужно проверить, больше ли количество символов из определенного набора в строке, чем какое-то число, какой самый быстрый способ сделать это?

Например, у меня есть длинная строканекоторый текст & некоторый текст & некоторый текст + намного больше + намного больше … и т. д.«и мне нужно проверить, существует ли более 3 следующих символов: [&,.,+]. Поэтому, когда я сталкиваюсь с 4-м появлением одного из этих символов, мне просто нужно вернуть false и остановить цикл. Поэтому я думаю создать такую ​​простую функцию. Но мне интересно, есть ли какой-нибудь нативный метод в php, чтобы сделать такую ​​вещь? Но мне нужна функция, которая не будет тратить время на разбор строки до конца, потому что строка может быть довольно длинной. Так что я думаю, что регулярные выражения и функции, такие как count_chars не подходит для такой работы …

Какие-либо предложения?

0

Решение

Я не знаю о родные метод, я думаю count_chars вероятно, так близко, как вы собираетесь получить. Тем не менее, развертывание пользовательского решения будет относительно простым:

$str = 'your text here';
$chars = ['&', '.', '+'];
$count = [];
$length = strlen($str);
$limit = 3;
for ($i = 0; $i < $length; $i++) {
if (in_array($str[$i], $chars)) {
$count[$str[$i]] += 1;
if ($count[$str[$i]] > $limit) {
break;
}
}
}

То, откуда на самом деле поступают данные, также может иметь значение. Например, если это из файла, вы можете воспользоваться fread2-й параметр, чтобы прочитать только количество байтов за раз в пределах while петля.

Нахождение самый быстрый способ может быть слишком широким вопросом, так как PHP имеет много функций, связанных со строками; другие решения могут использовать strstr, strpos, так далее…

2

Другие решения

Не тестировал другие решения, но http://php.net/manual/en/function.str-replace.php Передача массива опций будет быстрой. Существует необязательный параметр, который возвращает количество замен. Проверьте это число

 str_replace ( ['&','.','+'], '' , $subject , $count  )

if ($count > $number ) {
0

Ну, все мои мысли были неправильными, и мои ожидания были разрушены реальными испытаниями. RegExp, кажется, работает в 2-7 раз быстрее (с разными строками), чем самодельная функция с простым циклом проверки символов.

Код:

// self-made function:
function chk_occurs($str,$chrs,$limit){
$r=false;
$count = 0;
$length = strlen($str);
for($i=0; $i<$length; $i++){
if(in_array($str[$i], $chrs)){
$count++;
if($count>$limit){
$r=true;
break;
}
}
}
return $r;
}

// RegExp i've used for tests:
preg_match('/([&\\.\\+]|[&\\.\\+][^&\\.\\+]+?){3,}?/',$str);

Конечно, он работает быстрее, потому что это единственный вызов нативной функции, но даже тот же код, заключенный в функцию, работает в 2–4,8 раза быстрее.

//RegExp wrapped into the function:
function chk_occurs_preg($str,$chrs,$limit){
$chrs=preg_quote($chrs);
return preg_match('/(['.$chrs.']|['.$chrs.'][^'.$chrs.']+?){'.$limit.',}?/',$str);
}

Постскриптум я не удосужился проверить время процессора, просто тестировал время, измеренное с помощью микропоры (истина); цикла итерации 200К, но мне этого достаточно.

-1