PHP在string中查找所有出现的子string
我需要parsing一个HTML文档,并查找所有出现的stringasdf
。
我目前有HTML加载到一个stringvariables。 我只是喜欢字符位置,所以我可以通过列表循环来返回string后的一些数据。
strpos
函数只返回第一次出现。 如何返回所有这些?
不使用正则expression式,像这样的东西应该返回string位置:
$html = "dddasdfdddasdffff"; $needle = "asdf"; $lastPos = 0; $positions = array(); while (($lastPos = strpos($html, $needle, $lastPos))!== false) { $positions[] = $lastPos; $lastPos = $lastPos + strlen($needle); } // Displays 3 and 10 foreach ($positions as $value) { echo $value ."<br />"; }
您可以反复调用strpos
函数,直到找不到匹配项。 您必须指定偏移参数。
注意:在下面的例子中,search从下一个字符继续,而不是从前一个匹配结束。 根据这个函数, aaaa
包含三个子串aa
,而不是两个。
function strpos_all($haystack, $needle) { $offset = 0; $allpos = array(); while (($pos = strpos($haystack, $needle, $offset)) !== FALSE) { $offset = $pos + 1; $allpos[] = $pos; } return $allpos; } print_r(strpos_all("aaa bbb aaa bbb aaa bbb", "aa"));
输出:
Array ( [0] => 0 [1] => 1 [2] => 8 [3] => 9 [4] => 16 [5] => 17 )
最好使用substr_count
。 检查在php.net
function getocurence($chaine,$rechercher) { $lastPos = 0; $positions = array(); while (($lastPos = strpos($chaine, $rechercher, $lastPos))!== false) { $positions[] = $lastPos; $lastPos = $lastPos + strlen($rechercher); } return $positions; }
这可以使用strpos()函数完成。 以下代码是使用for循环实现的。 这段代码非常简单,非常简单。
<?php $str_test = "Hello World! welcome to php"; $count = 0; $find = "o"; $positions = array(); for($i = 0; $i<strlen($str_test); $i++) { $pos = strpos($str_test, $find, $count); if($pos == $count){ $positions[] = $pos; } $count++; } foreach ($positions as $value) { echo '<br/>' . $value . "<br />"; } ?>
使用preg_match_all
查找所有的事件。
preg_match_all('/(\$[az]+)/i', $str, $matches);
进一步的参考检查这个链接 。