Я не большой поклонник «итерацию каждый символ» ответ от Jigar, поскольку он не обеспечивает быстрый выход, когда есть больше не найдено игл (он выполняет итерацию всей строки независимо) - это может стать более дорогостоящим в более длинных строках. Представьте, что у вас есть строка в 10 000 символов, и единственное появление иглы - на первом символе - это будет означать, что еще 9999 проверок повторов без использования. Правда в том, что я не проводил бенчмаркинга, это, возможно, не большая проблема.
Что касается вашего метода, вы просто должны выполнить строгое сравнение на результат strpos()
так, что PHP будет правильно различать false
и 0
результат. Для этого вам нужно только обернуть объявление strpos()
в круглые скобки и написать сравнение по типу (!==false
).
Вот два способа (не-регулярные выражения и регулярные выражения):
Код: (Demo)
$string='orem ipsum dolor sit amet, consectetur adipisicing elit.';
$find='o';
$offset=0;
$length=strlen($find);
while(($string_pos=strpos($string,$find,$offset))!==false){ // just use a strict comparison
echo "String $find found at position $string_pos\n";
$offset=$length+$string_pos;
}
echo "\n";
var_export(preg_match_all('/o/',$string,$out,PREG_OFFSET_CAPTURE)?array_column($out[0],1):'no matches');
Выход:
String o found at position 0
String o found at position 12
String o found at position 14
String o found at position 28
array (
0 => 0,
1 => 12,
2 => 14,
3 => 28,
)
В вашем случае, preg_match_all()
все переполнен. Однако, если вы хотите подсчитать несколько разных слов или целые слова или что-то другое, это может оказаться правильным инструментом.
Помимо этого, в зависимости от сценария поиска, str_word_count() имеет параметр, в котором он может возвращать смещения всех слов в строке, - тогда вы можете вызвать функцию фильтрации, чтобы сохранить только нужные слова. Просто подумал, что я брошу это предложение для будущих читателей; это не относится к этому вопросу.
Возможный дубликат [3 разных равных] (http://stackoverflow.com/questions/2063480/the-3-different-equals) –
, вы можете исправить свой цикл, если вы скажете что-то вроде этого: 'while (($ string_pos = strpos ($ string, $ find, $ offset))! == false) ' –
Если вы посмотрите на документацию, она заявляет и показывает пример использования === or! ==, чтобы избежать значение 0 отбрасывается в false. – kainaw