【问题标题】:How to get the last occurrence of a string?如何获取字符串的最后一次出现?
【发布时间】:2018-06-25 01:38:52
【问题描述】:

我有一个函数可以在 $string 中提取 $start 和 $end 之间的内容

function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

这样做的问题是它只会让我在字符串中找到第一个匹配项。举例:

$text = "John has 13 oranges and Jane has 8 oranges";
$how_many_oranges = get_string_between($text,"has "," oranges");
echo $how_many_oranges; // echos "13"

我需要它来查找字符串中的最后一次出现,以便 $how_many_oranges = "8";

【问题讨论】:

  • 你可以把strpos()换成strrpos()
  • 我很好奇$ini == 0 支票;你为什么这样做?如果$start 位于字符串的开头,则strpos() 将返回0。你是不是想检查$ini === false,即找不到字符串?
  • 那不就是在做同样的事情吗?即如果没有找到返回“”?
  • 0 表示找到(在字符串的开头)

标签: php


【解决方案1】:

正如我在评论中提到的,将strpos() 换成strrpos()

在 haystack 字符串中查找针最后次出现的数字位置。

另外,我认为你应该改变

if ($ini == 0)

if ($ini === false)

如果$start 位于$string 的开头,则前者将匹配。如果根本找不到$start,后者将匹配。

演示~https://eval.in/1027283

【讨论】:

  • 谢谢菲尔。我发现最好只将第一个 strpos() 替换为 strrpos() ——同时替换两者会在许多情况下引入一些问题。例如,如果 $test =“John 有 13 个橙子,Jane 有 8 个橙子,但他们需要更多的橙子”,则结果将不再是“8”。仅替换第一个可以解决此问题。
【解决方案2】:

我冒昧地重写了您的代码,以使其更具可读性和不言自明:)

我还建议您使用strrpos

function getStringBetween($string, $start, $end) {
    $lastStartIndex = strrpos($string, $start);
    $lastEndIndex = strrpos($string, $end);

    $substringStartIndex = $lastStartIndex + strlen($start);
    $substringSize = $lastStartIndex - $lastEndIndex - 1;

    return substr($string, $substringStartIndex, $substringSize);
}

$text = "John has 13 oranges and Jane has 8 oranges";
$how_many_oranges = getStringBetween($text, "has", "oranges");
echo "'" . $how_many_oranges . "'"; // echos "' 8 '"

【讨论】:

    【解决方案3】:

    试试这个:

    function get_string_between($string, $start, $end){
        $p1 = explode($start,$str);
        for($i=1;$i<count($p1);$i++){
            $p2 = explode($end,$p1[$i]);
            $p[] = $p2[0];
        }
        return $p;
    }
    

    来源:stackoverflow.com/a/45033158

    【讨论】:

      【解决方案4】:

      这似乎是使用正则表达式的合理时机。

          function get_string_between($string, $start, $end) {
              $clean_start = preg_quote($start, '/');
              $clean_end = preg_quote($end, '/');
              $pattern = "/.*$clean_start (.*) $clean_end.*/U"; // U modifier => ungreedy
              $default_result = ''; // returned if no matches found
              $matches;
              preg_match_all($pattern, $string, $matches);
              return (count($matches[1]) > 0) ? end($matches[1]) : $default_result;
          }
      
      echo get_string_between('John has 13 oranges and Jane has 8 oranges', 'has', 'oranges'); // 8
      

      【讨论】:

        【解决方案5】:

        只使用 PHP 的内置函数怎么样?!

        strripos() – 查找一个字符串在另一个字符串中最后一次出现的位置。它不区分大小写。

        PHP Docs

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-17
          • 2021-08-22
          • 1970-01-01
          • 2020-10-25
          • 1970-01-01
          • 2014-03-04
          • 2013-12-28
          相关资源
          最近更新 更多