HTML ドキュメントを解析し、その中のすべての文字列を見つける必要がありますasdf
。
現在、HTML を文字列変数にロードしています。リストをループして、文字列の後にデータを返すことができるように、文字の位置が欲しいだけです。
この関数は、最初に出現strpos
したもののみを返します。全部返してはどうですか?
正規表現を使用しない場合、次のような方法で文字列の位置を返すことができます。
$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
一致が見つからなくなるまで、関数を繰り返し呼び出すことができます。オフセット パラメータを指定する必要があります。
注: 次の例では、前の一致の終わりからではなく、次の文字から検索が続行されます。この関数によれば、には substring が 2 回ではなく 3 回出現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
)
すべての出現箇所preg_match_all
を検索するために使用します。
preg_match_all('/(\$[a-z]+)/i', $str, $matches);
詳細については、このリンクを確認してください。
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 />";
}
?>
シンプルなstrpos_all()関数。
function strpos_all($haystack, $needle_regex)
{
preg_match_all('/' . $needle_regex . '/', $haystack, $matches, PREG_OFFSET_CAPTURE);
return array_map(function ($v) {
return $v[1];
}, $matches[0]);
}
用途:針のような単純な紐。
$html = "dddasdfdddasdffff";
$needle = "asdf";
$all_positions = strpos_all($html, $needle);
var_dump($all_positions);
出力:
array(2) {
[0]=>
int(3)
[1]=>
int(10)
}
または正規表現を針として使用します。
$html = "dddasdfdddasdffff";
$needle = "[d]{3}";
$all_positions = strpos_all($html, $needle);
var_dump($all_positions);
出力:
array(2) {
[0]=>
int(0)
[1]=>
int(7)
}