所以我再一次练习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;
}
我对这一切都很陌生,有人可以帮我解释一下吗?我正在寻找它来循环所有事件。
答案 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就能正确地区分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()有一个设置,可以返回字符串中所有单词的偏移量 - 然后你可以调用过滤函数来保留你想要的单词。我以为我会把这个建议留给未来的读者;它并不适用于这个问题。