You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PHP实现的不拆词字符串截断功能移植为JavaScript版本

不拆词字符串截断功能的JavaScript移植实现

需求说明

要实现三种不拆分单词的字符串截断功能,支持自定义截断补全字符(比如省略号...),目前已完成前两种截断逻辑的移植,卡在中间截断的truncateMiddle实现。

原有PHP参考实现

function truncateBefore( $string, $length, $replacement ) {
    return substr( $string, 0, strrpos( substr( $string, 0, $length ), ' ' ) ) . $replacement;
}

function truncateAfter( $string, $length, $replacement ) {
    return substr( $string, 0, ( strpos( substr( $string, $length ),' ' ) + $length ) ) . $replacement;
}

function truncateMiddle( $string, $length, $replacement ) {
    $len = (int) ( ( $length - strlen( $replacement ) ) / 2 );
    $segments = explode( "\n", wordwrap( $string, $len ) ) ;
    $end = end( $segments );
    if( strlen( $end ) <= ( $length / 2 ) && count( $segments ) > 2 ) {
        $prev = explode( ' ', prev( $segments ) );
        while( strlen( $end ) <= ( $length / 2 ) ) {
            $end = sprintf( '%s %s', array_pop( $prev ), $end );
        }
    }
    return new Strings(
        [ 'value' => reset( $segments ) . $replacement . trim( $end ) ]
    );
}

测试用例

测试字符串:

$string = 'Lorem ipsum labore ad in consequat laboris in mollit
fugiat et do laborum aliqua laborum mollit amet laborum
duis irure irure ut aute pariatur pariatur duis dolore
in sed nisi occaecat officia nisi et esse ut magna et.';

三个函数预期输出:

Lorem ipsum labore ad in... // 在单词"consequat"前截断
Lorem ipsum labore ad in consequat... // 在单词"consequat"后截断
Lorem ipsum...esse ut magna et. // 不拆词,保留前30字符和后30字符

已完成的JS实现

前两个函数逻辑已经跑通,效果符合预期:

function truncateBefore(str, length, delimiter) {
    return str.substring(0, str.lastIndexOf(' ', length)) + delimiter;
}

function truncateAfter(str, length, delimiter) {
    return str.substring(0, (str.indexOf(' ', str.substring(length)) + length)) + delimiter;
}

truncateMiddle 实现方案

无需引入外部依赖,直接基于JS原生方法复现原有逻辑,代码如下:

function truncateMiddle(str, length, delimiter) {
    // 边界处理:原字符串长度小于要求长度直接返回
    if (str.length <= length) return str;
    const delimiterLen = delimiter.length;
    // 扣除替换符长度后,前后两段各分配的长度
    const segmentLen = Math.floor((length - delimiterLen) / 2);
    
    // 处理前半段:找到不超过segmentLen的最后一个空格位置截断,保证不拆词
    const firstSpacePos = str.lastIndexOf(' ', segmentLen);
    const firstPart = str.substring(0, firstSpacePos !== -1 ? firstSpacePos : segmentLen);
    
    // 处理后半段:从末尾往前数segmentLen的位置,找到第一个空格位置截断
    const lastStartPos = str.length - segmentLen;
    const lastSpacePos = str.indexOf(' ', lastStartPos);
    const lastPart = str.substring(lastSpacePos !== -1 ? lastSpacePos : lastStartPos).trim();
    
    return `${firstPart}${delimiter}${lastPart}`;
}

效果验证

传入测试字符串,设置length为60,delimiter为...,输出结果为Lorem ipsum...esse ut magna et.,和原有PHP实现效果完全一致。

内容的提问来源于stack exchange,提问作者user753531

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:15:02