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

dhxwm5r4  于 2023-05-12  发布在  PHP
关注(0)|答案(6)|浏览(152)

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

$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");计算出现的次数,但我还没有在网上搜索到其他东西。

idv4meu8

idv4meu81#

要找到第四个2的位置,可以从偏移量0开始,递归调用$offset = strpos($str, '2', $offset) + 1,同时跟踪到目前为止匹配了多少个2。当你达到4时,你只能使用substr()
当然,上面的逻辑并没有考虑到false的返回值或2的数量不足,我将把这个问题留给您。
您还可以使用preg_match_allPREG_OFFSET_CAPTURE标志来避免自己进行递归。
另一个选项,扩展@matt idea:

implode('2', array_slice(explode('2', $string, 5), 0, -1));
6pp0gazn

6pp0gazn2#

$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

3gtaxfhh

3gtaxfhh3#

也许这对你有用:

$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
wvyml7n5

wvyml7n54#

下面的代码片段可以做到这一点:

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

de90aj5v5#

简单点怎么样

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

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

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

echo $finalString;
axzmvihb

axzmvihb6#

匹配零个或多个非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 which splits a string on every n characters上有类似的模式建议。

相关问题