如何获取字符串的最后一次出现?

4
我有一个函数,可以从$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";

2
你可以尝试用strrpos()替换掉strpos() - Phil
我对 $ini == 0 的检查很好奇,你为什么这样做?如果 $start 在字符串的开头,strpos() 将会返回 0。你是不是想要检查 $ini === false,也就是无法找到字符串的情况? - Phil
那不是做同样的事情吗?即如果没有找到,返回“”。 - gonna_take_sometime
0 表示在字符串开头找到。 - Phil
5个回答

5

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

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

另外,我认为你应该进行更改。

if ($ini == 0)

to

if ($ini === false)

前者会匹配如果$start$string的开头。后者会匹配如果$start根本找不到。
演示 ~ https://eval.in/1027283

谢谢Phil。我发现最好只替换第一个strpos()为strrpos() -- 替换两个会在很多情况下引入问题。例如,如果$test = "约翰有13个橙子,简有8个橙子,但是他们需要更多的橙子",则不再会给你"8"作为结果。只替换第一个可以解决这个问题。 - gonna_take_sometime

1

仅使用PHP的内置函数如何?!

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

PHP文档


0

试试这个:

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


0

我稍微改写了你的代码,以我的个人见解来说,让它更易读和自解释 :)

我还建议你使用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 '"

0

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

    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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接