在子字符串出现一定次数后截断字符串

问题描述 投票:0回答:6

假设我有一个字符串变量:

$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");
出现的次数,但我还没有找到其他在线搜索。

php string variables substring truncate
6个回答
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));

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


1
投票

也许这对你有用:

$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

1
投票

这个代码片段应该做到:


implode($needle, array_slice(explode($needle, $string), 0, $limit));

0
投票

简单的东西怎么样

$newString = explode('2',$string);

然后根据需要循环遍历数组:

$finalString = null;
for($i=0:$i<2;$i++){
    $finalString .= 2 . $newString[$i];
}

echo $finalString;

0
投票

匹配零个或多个非 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
     );

我在this answer中有类似的模式建议,它在每n个字符上拆分一个字符串.

© www.soinside.com 2019 - 2024. All rights reserved.