Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-显示输出而不截断单词_Php_Split_Word_Word Wrap - Fatal编程技术网

PHP-显示输出而不截断单词

PHP-显示输出而不截断单词,php,split,word,word-wrap,Php,Split,Word,Word Wrap,我有一个搜索结果,在切断整个字符串时,它严格计算搜索词前后的字符数。不幸的是,这会导致输出在中间切断单词。计数前后都有一个椭圆 我试图让搜索结果只在空白处与单词中间截断整个字符串。 以下是函数: private function _highlight_results(){ $GLOBALS['_SEARCH_SUMMARY_LENGTH'] = 24; foreach($this->results as $url => &$this_result){

我有一个搜索结果,在切断整个字符串时,它严格计算搜索词前后的字符数。不幸的是,这会导致输出在中间切断单词。计数前后都有一个椭圆

我试图让搜索结果只在空白处与单词中间截断整个字符串。

以下是函数:

private function _highlight_results(){

    $GLOBALS['_SEARCH_SUMMARY_LENGTH'] = 24;

    foreach($this->results as $url => &$this_result){
        if(!$this_result['url_display'] && $this_result['url']){
            $this_result['url_display'] = $this_result['url'];
        }
        foreach($this_result['search_term'] as $search_term){
            $search_term = preg_quote($search_term,'/');

            foreach(array('title','summary','url_display') as $highlight_item){
                if($this_result[$highlight_item] && preg_match('/'.$search_term.'/i',$this_result[$highlight_item])){
                    if($highlight_item != 'url_display' && strlen($this_result[$highlight_item]) > $GLOBALS['_SEARCH_SUMMARY_LENGTH']){
                        $boobs = ceil(($GLOBALS['_SEARCH_SUMMARY_LENGTH']-strlen($this->_search_term))/2);
                        preg_match('/(.{0,'.$boobs.'})('.$search_term.')(.{0,'.$boobs.'})/i',$this_result[$highlight_item],$matches);
                        // want to even out the strings a bit so if highlighted term is at end of string, put more characters infront.
                        $before_limit = $after_limit = ($boobs - 2);
                        if(strlen($matches[1])>=$before_limit && strlen($matches[3])>=$after_limit){
                            // leave limit alone.
                        }else if(strlen($matches[1])<$before_limit){
                            $after_limit += $before_limit - strlen($matches[1]);
                            $before_limit = strlen($matches[1]);
                            preg_match('/(.{0,'.($before_limit+2).'})('.$search_term.')(.{0,'.($after_limit+2).'})/i',$this_result[$highlight_item],$matches);
                        }else if(strlen($matches[3])<$after_limit){
                            $before_limit += $after_limit - strlen($matches[3]);
                            $after_limit = strlen($matches[3]);
                            preg_match('/(.{0,'.($before_limit+2).'})('.$search_term.')(.{0,'.($after_limit+2).'})/i',$this_result[$highlight_item],$matches);
                        }
                        $this_result[$highlight_item] = (strlen($matches[1])>$before_limit) ? '...'.substr($matches[1],-$before_limit) : $matches[1];
                        $this_result[$highlight_item] .= $matches[2];
                        $this_result[$highlight_item] .= (strlen($matches[3])>$after_limit) ? substr($matches[3],0,$after_limit).'...' : $matches[3];

                    }

                }else if(strlen($this_result[$highlight_item]) > $GLOBALS['_SEARCH_SUMMARY_LENGTH']){
                    $this_result[$highlight_item] = substr($this_result[$highlight_item],0,$GLOBALS['_SEARCH_SUMMARY_LENGTH']).'...';
                }
            }
        }

        foreach($this_result['search_term'] as $search_term){
            $search_term = preg_quote($search_term,'/');

            foreach(array('title','summary','url_display') as $highlight_item){
                $this_result[$highlight_item] = preg_replace('/'.$search_term.'/i','<span id="phpsearch_resultHighlight">$0</span>',$this_result[$highlight_item]);
            }
        }
    }
}

我想你可以从上面的东西中了解到我在寻找什么。我已经研究并测试了wordwrap,但仍然没有找到答案。

这里有一种方法应该可以很好地工作,而且性能也很好。唯一的缺点是,它只在现有的空格上断开单词,这不能简单地修复,因为没有strrspn函数来补充,但是可以很容易地编写并用于扩展此解决方案

function display_short($str, $limit, $ellipsis = '...') {
    // if all of it fits there's nothing to do
    if (strlen($str) <= $limit) {
        return $str;
    }

    // $ellipsis will count towards $limit
    $limit -= strlen($ellipsis);

    // find the last space ("word boundary")
    $pos = strrpos($str, ' ', $limit - strlen($str));

    // if none found, prefer breaking into the middle of
    // "the" word instead of just giving up
    if ($pos === false) {
        $pos = $limit;
    }

    return substr($str, 0, $pos).$ellipsis;
}
使用以下各项进行测试:

$string = "the quick brown fox jumps over the lazy dog";
for($limit = 10; $limit <= strlen($string); $limit += 10) {
    print_r(display_short($string, $limit));
}

.

我建议你在这个网站上搜索带有正则表达式的wordwrap,它应该会给你一些类似的提示。试试这个链接,可能会帮助你。。。我已尝试此函数,但收到以下错误:调用未定义函数display\u short。。。有什么想法吗?在这一点上,我认为最简单的处理方法是向某人请求一个类似这样的正则表达式:FOREACH CHAR{preg_替换从字符串开始的搜索-然后-查找“…”-然后-如果CHAR不是空白,删除CHAR或继续查找空白?-然后-如果CHAR是空白,则断开}然后用另一个preg_替换结尾“…”@user1355539:我认为最简单的方法是将Ideone上的实例与代码进行比较,看看哪里出了问题。不会那么难的我想出了发帖的解决办法。在显示任何输出之前,为$i=0添加以下代码:[code]$i0$i-{if$summary_edit[$i]!='{$summary_edit[$i]=;}否则{break;}}echo'.'$摘要编辑“…”;[/code]
$string = "the quick brown fox jumps over the lazy dog";
for($limit = 10; $limit <= strlen($string); $limit += 10) {
    print_r(display_short($string, $limit));
}