Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取字符串的最后一次出现?_Php - Fatal编程技术网

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

Php 如何获取字符串的最后一次出现?,php,Php,我有一个函数,可以在$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) - $i

我有一个函数,可以在$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”

试试这个:

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;
}
函数get\u string\u-between($string,$start,$end){ $p1=爆炸($start$str);
对于我在评论中提到的($i=1;$i),请将strpos()替换为

查找干草堆字符串中针的最后一次出现的数值位置

而且,我认为你应该改变

if ($ini == 0)

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


演示~

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

我还建议您使用:


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

    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

您可能只需要调出
strpos()
,因为我对
$ini==0
检查很好奇;为什么要这样做?如果
$start
位于字符串的最开头,
strpos()
将返回
0
。您是否要检查
$ini==false
,即找不到字符串?这不就是做同样的事情吗?即如果找不到,返回“”?0表示找到(在字符串的开头)谢谢Phil。我发现最好只将第一个strpos()替换为strrpos()--替换这两个选项会在许多场景中引入一些问题。例如,如果$test=“John有13个桔子,Jane有8个桔子,但他们需要更多桔子”,则结果将不再是“8”。仅替换第一个选项可以解决此问题。
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 '"
    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