0循环的strpos

时间:2015-02-18 19:06:16

标签: php while-loop offset strpos

所以我再一次练习PHP。具体来说,strpos()在while循环中。

以下代码的问题是strpos()在第一个循环中导致0,这会在while条件中产生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 个答案:

答案 0 :(得分: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>';
    }
}

?>

答案 1 :(得分:0)

我不是&#34;反复每个角色的忠实粉丝&#34;来自Jigar的回答是因为当找不到更多针时它不会提供快速退出(无论如何都会迭代整个字符串) - 这在较长的字符串中会变得更加昂贵。想象一下,你有一个10,000字符的字符串,唯一出现的针是第一个字符 - 这意味着要进行9999次迭代检查,没有可用的输出。事实是我没有做任何基准测试,这可能不是什么大问题。

至于你的方法,你只需要对strpos()的结果进行严格的比较,这样php就能正确地区分false0结果。要实现此目的,您只需将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()有一个设置,可以返回字符串中所有单词的偏移量 - 然后你可以调用过滤函数来保留你想要的单词。我以为我会把这个建议留给未来的读者;它并不适用于这个问题。