excerpt(); function is not counting/working japanese words

I am working on Japanese language web site, and using this code for words limit, it is working when I paste English sentence but not working with Japanese words .

function content($num) {
$theContent = get_the_content();
$output = preg_replace('/<img[^>]+./','', $theContent);
$output = preg_replace( '/<blockquote>.*</blockquote>/', '', $output );
$output = preg_replace( '|[(.+?)](.+?[/\1])?|s', '', $output );
$limit = $num+1;
$content = explode(' ', $output, $limit);
array_pop($content);
$content = implode(" ",$content)."...";
  echo $content;
}


<?php content('15'); ?>

Can any body help me, and one thing is that I am using xeory_extension theme.

Related posts

2 comments

  1. The problem is that Japanese characters are multibyte (Hiragana and Katakana characters are stored on 3 bytes in UTF-8), so you’ll have to use special php multibytes string functions to manipulate strings that contains Japanese characters.

    Sadly PHP doesn’t provide a mb_explode function out of the box. Though some people worked on that, using mb_strlen and mb_substr to build up that missing function.

    The following code is note mine, it comes from the fetus-hina mb_explode gist:

    function mb_explode($delimiter, $string, $limit = -1, $encoding = 'auto') {
        if(!is_array($delimiter)) {
            $delimiter = array($delimiter);
        }
        if(strtolower($encoding) === 'auto') {
            $encoding = mb_internal_encoding();
        }
        if(is_array($string) || $string instanceof Traversable) {
            $result = array();
            foreach($string as $key => $val) {
                $result[$key] = mb_explode($delimiter, $val, $limit, $encoding);
            }
            return $result;
        }
    
        $result = array();
        $currentpos = 0;
        $string_length = mb_strlen($string, $encoding);
        while($limit < 0 || count($result) < $limit) {
            $minpos = $string_length;
            $delim_index = null;
            foreach($delimiter as $index => $delim) {
                if(($findpos = mb_strpos($string, $delim, $currentpos, $encoding)) !== false) {
                    if($findpos < $minpos) {
                        $minpos = $findpos;
                        $delim_index = $index;
                    }
                }
            }
            $result[] = mb_substr($string, $currentpos, $minpos - $currentpos, $encoding);
            if($delim_index === null) {
                break;
            }
            $currentpos = $minpos + mb_strlen($delimiter[$delim_index], $encoding);
        }
        return $result;
    }
    

    Then just use it the same way you use explode:

    $content = mb_explode(' ', $output, $limit);
    

    And for implode, you shouldn’t have any issue.

  2. This worked for me

        function custom_short_excerpt($excerpt){
        $limit = 200;
    
        if (strlen($excerpt) > $limit) {
            return substr($excerpt, 0, strpos($excerpt, ' ', $limit));
        }
    
        return $excerpt;
    }
    
    add_filter('the_excerpt', 'custom_short_excerpt');
    

Comments are closed.