【发布时间】:2021-10-28 05:37:54
【问题描述】:
在过去的几个小时里,我一直在尝试将我在使用该语言时使用的 PHP 代码移植到 JavaScript,以便截断用点(或任何其他字符串)插入它们的字符串,但仅部分成功。
这是大约四年前开发的三种已经可以工作的算法——我自己做了两个,最后一个更复杂,I had a big help
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 );
// Separate the output from wordwrap() into an array of lines
$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... // Before the "consequat"
Lorem ipsum labore ad in consequat... // After the "consequat"
Lorem ipsum...esse ut magna et. // Without breaking words, first 30 and last 30
现在我解释了一切,关于我当前的问题(JavaScript),这些是我的尝试:
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;
}
function truncateMiddle( str, $length, delimiter ) {
// Nothing :(
}
前两个就像一个魅力(当然,我可以测试)。花在阅读 MDN 上的时间得到了回报,但第三次我什至无法开始,因为它依赖于一些 JS 没有的东西。
当然,我可以找到“polyfills”,事实上,我确实找到了(例如wordwrap()),但最后,end()、reset() 和prev() 胜过我。
试图求助于 PHP.JS 项目,却发现它现在被称为 Locutus,更大而且有些复杂,没有即插即用的能力......初次见面。
我怎样才能做到这一点?
【问题讨论】:
标签: javascript php portability