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函数,直到找不到匹配项。您必须指定偏移参数。

注意:在下面的例子中,搜索从下一个字符开始,而不是从上一个匹配的结尾开始。根据这个函数,aaaa包含三个出现的 substring 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 回答
17

它更好地使用substr_count在php.net上查看

于 2013-11-14T11:42:06.853 回答
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 回答
2

Salman A 有一个很好的答案,但请记住让您的代码多字节安全。要使用 UTF-8 获得正确的位置,请使用 mb_strpos 而不是 strpos:

function strpos_all($haystack, $needle) {
    $offset = 0;
    $allpos = array();
    while (($pos = mb_strpos($haystack, $needle, $offset)) !== FALSE) {
        $offset   = $pos + 1;
        $allpos[] = $pos;
    }
    return $allpos;
}
print_r(strpos_all("aaa bbb aaa bbb aaa bbb", "aa"));
于 2020-04-22T09:06:36.727 回答
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 回答
0
<?php
$mainString = "dddjmnpfdddjmnpffff";
$needle = "jmnp";
$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 />";
}
?>
于 2020-07-20T17:01:36.817 回答
0

另一种解决方案是使用explode()

public static function allSubStrPos($str, $del)
{
    $searchArray = explode($del, $str);
    unset($searchArray[count($searchArray) - 1]);
    $positionsArray = [];
    $index = 0;
    foreach ($searchArray as $i => $s) {
        array_push($positionsArray, strlen($s) + $index);
        $index += strlen($s) + strlen($del);
    }
    return $positionsArray;
}
于 2021-05-08T22:59:39.767 回答