假设我有一个字符串变量:
$string = "1 2 3 1 2 3 1 2 3 1 2 3";
我想从第四次出现的子字符串“2”开始切断这个字符串的末尾,所以
$string
现在等于:1 2 3 1 2 3 1 2 3 1
.
有效截断第四次出现的“2”及其后的所有内容
一个人会怎么做呢?我知道如何计算
substr_count($string,"2");
出现的次数,但我还没有找到其他在线搜索。
要找到第四个
2
的位置,您可以从偏移量 0 开始并递归调用 $offset = strpos($str, '2', $offset) + 1
,同时跟踪到目前为止您匹配了多少个 2。一旦你达到4,你就可以使用substr()
.
当然,上面的逻辑并没有考虑
false
的回报或不够的2,我会留给你。
您也可以将
preg_match_all
与 PREG_OFFSET_CAPTURE
标志一起使用,以避免自己进行递归。
另一种选择,扩展@matt 的想法:
implode('2', array_slice(explode('2', $string, 5), 0, -1));
$string = explode( "2", $string, 5 );
$string = array_slice( $string, 0, 4 );
$string = implode( "2", $string );
在此处查看实际操作:http://codepad.viper-7.com/GM795F
为了增加一些混乱(因为人们不会这样做),你可以把它变成一个单行:
implode( "2", array_slice( explode( "2", $string, 5 ), 0, 4 ) );
在此处查看实际操作:http://codepad.viper-7.com/mgek8Z
对于更理智的方法,将其放入函数中:
function truncateByOccurence ($haystack, $needle, $limit) {
$haystack = explode( $needle, $haystack, $limit + 1 );
$haystack = array_slice( $haystack, 0, $limit );
return implode( $needle, $haystack );
}
在此处查看实际操作:http://codepad.viper-7.com/76C9VE
也许这对你有用:
$str = "1 2 3 1 2 3 1 2 3 1 2 3"; // initial value
preg_match("#((.*)2){0,4}(.*)#",$str, $m);
//var_dump($m);
$str = $m[2]; // last value
这个代码片段应该做到:
implode($needle, array_slice(explode($needle, $string), 0, $limit));
简单的东西怎么样
$newString = explode('2',$string);
然后根据需要循环遍历数组:
$finalString = null;
for($i=0:$i<2;$i++){
$finalString .= 2 . $newString[$i];
}
echo $finalString;
匹配零个或多个非 2 字符后跟一个 2——重复 4 次。
在每次匹配 2 之前重新启动全字符串匹配
\K
.
成功匹配四个2后,匹配剩余的字符,并将匹配到的字符替换为空字符串。
$string = "1 2 3 1 2 3 1 2 3 1 2 3";
echo preg_replace(
'~([^2]*\K2){4}.*~',
'',
$string
);