66

HTML ドキュメントを解析し、その中のすべての文字列を見つける必要がありますasdf

現在、HTML を文字列変数にロードしています。リストをループして、文字列の後にデータを返すことができるように、文字の位置が欲しいだけです。

この関数は、最初に出現strposしたもののみを返します。全部返してはどうですか?

4

10 に答える 10

94

正規表現を使用しない場合、次のような方法で文字列の位置を返すことができます。

$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 />";
}
于 2013-04-01T04:01:40.260 に答える
22

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
)
于 2014-12-06T15:34:56.447 に答える
4

すべての出現箇所preg_match_allを検索するために使用します。

preg_match_all('/(\$[a-z]+)/i', $str, $matches);

詳細については、このリンクを確認してください。

于 2013-04-01T04:04:24.533 に答える
4
function getocurence($chaine,$rechercher)
        {
            $lastPos = 0;
            $positions = array();
            while (($lastPos = strpos($chaine, $rechercher, $lastPos))!== false)
            {
                $positions[] = $lastPos;
                $lastPos = $lastPos + strlen($rechercher);
            }
            return $positions;
        }
于 2014-03-08T15:32:21.837 に答える
3

これは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 />";
}

?>
于 2014-02-04T16:56:48.423 に答える
0

シンプルな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)
}
于 2020-04-10T16:07:20.227 に答える