2015-02-18 2 views
-1

Итак, еще раз я занимаюсь PHP. В частности, strpos() в цикле while.strpos of 0 break while loop

Проблема с кодом ниже, что приводит к strpos()0 в первом цикле, что дает false результат в состоянии в то время, таким образом, завершение цикла.

$string = 'orem ipsum dolor sit amet, consectetur adipisicing elit.'; 
$find = 'o'; 
$offset = 0; 
$length = strlen($find); 

while ($string_pos = strpos($string, $find, $offset)) { 
    echo 'String '.$find.' found at position '.$string_pos.'.<br>'; 
    $offset = $length + $string_pos; 
} 

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

+2

Возможный дубликат [3 разных равных] (http://stackoverflow.com/questions/2063480/the-3-different-equals) –

+2

, вы можете исправить свой цикл, если вы скажете что-то вроде этого: 'while (($ string_pos = strpos ($ string, $ find, $ offset))! == false) ' –

+0

Если вы посмотрите на документацию, она заявляет и показывает пример использования === or! ==, чтобы избежать значение 0 отбрасывается в false. – kainaw

ответ

0

Если вы не хотите использовать strpos():

<?php 

$string = 'orem ipsum dolor sit amet, consectetur adipisicing elit.'; 
$find = 'o'; 

for($i = 0; $i <= strlen($string)-1; $i++){ 
    // we are checking with each index of the string here 
    if($string[$i] == $find){ 
     echo 'String '.$find.' found at position '.$i.'.<br>'; 
    } 
} 

?> 
+0

По-моему, это плохое предложение. Производительность мудрая, удобство использования, мудрый. –

0

Я не большой поклонник «итерацию каждый символ» ответ от 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() имеет параметр, в котором он может возвращать смещения всех слов в строке, - тогда вы можете вызвать функцию фильтрации, чтобы сохранить только нужные слова. Просто подумал, что я брошу это предложение для будущих читателей; это не относится к этому вопросу.