假设我有一个字符串变量:
$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");计算出现的次数,但我还没有在网上搜索到其他东西。
$string
1 2 3 1 2 3 1 2 3 1
substr_count($string,"2");
idv4meu81#
要找到第四个2的位置,可以从偏移量0开始,递归调用$offset = strpos($str, '2', $offset) + 1,同时跟踪到目前为止匹配了多少个2。当你达到4时,你只能使用substr()。当然,上面的逻辑并没有考虑到false的返回值或2的数量不足,我将把这个问题留给您。您还可以使用preg_match_all和PREG_OFFSET_CAPTURE标志来避免自己进行递归。另一个选项,扩展@matt idea:
2
$offset = strpos($str, '2', $offset) + 1
substr()
false
preg_match_all
PREG_OFFSET_CAPTURE
implode('2', array_slice(explode('2', $string, 5), 0, -1));
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
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
wvyml7n54#
下面的代码片段可以做到这一点:
implode($needle, array_slice(explode($needle, $string), 0, $limit));
de90aj5v5#
简单点怎么样
$newString = explode('2',$string);
然后根据需要循环遍历数组:
$finalString = null; for($i=0:$i<2;$i++){ $finalString .= 2 . $newString[$i]; } echo $finalString;
axzmvihb6#
匹配零个或多个非2字符,后跟2 -重复4次。在每个匹配的2之前用\K重新开始全字符串匹配。成功匹配四个2后,匹配剩余的字符并将匹配的字符替换为空字符串。
\K
$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上有类似的模式建议。
6条答案
按热度按时间idv4meu81#
要找到第四个
2
的位置,可以从偏移量0开始,递归调用$offset = strpos($str, '2', $offset) + 1
,同时跟踪到目前为止匹配了多少个2。当你达到4时,你只能使用substr()
。当然,上面的逻辑并没有考虑到
false
的返回值或2的数量不足,我将把这个问题留给您。您还可以使用
preg_match_all
和PREG_OFFSET_CAPTURE
标志来避免自己进行递归。另一个选项,扩展@matt idea:
6pp0gazn2#
在这里看到它的行动:http://codepad.viper-7.com/GM795F
为了增加一些混乱(因为人们不会这样做),您可以将其转换为一行程序:
在这里看到它的行动:http://codepad.viper-7.com/mgek8Z
为了更明智的方法,将其放入函数中:
在这里看到它的行动:http://codepad.viper-7.com/76C9VE
3gtaxfhh3#
也许这对你有用:
wvyml7n54#
下面的代码片段可以做到这一点:
de90aj5v5#
简单点怎么样
然后根据需要循环遍历数组:
axzmvihb6#
匹配零个或多个非2字符,后跟2 -重复4次。
在每个匹配的2之前用
\K
重新开始全字符串匹配。成功匹配四个2后,匹配剩余的字符并将匹配的字符替换为空字符串。
我在this answer which splits a string on every n characters上有类似的模式建议。