Php 如何获取字符串的最后一次出现?
我有一个函数,可以在$string中提取$start和$end之间的内容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
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