2015-08-31 8 views
3

У меня есть эта функция работает не совсем хорошо в PHP 5.2.0, эта функция вырезать строку в нужной длины:Как отрезать многобайтовую строку (английское слово и китайский символ) в PHP?

function neat_trim($str, $n, $delim='...') 
{ 
    $len = strlen($str); 

    if ($len > $n) 
    { 
     preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches); 
     return rtrim($matches[1]) . $delim; 
    } 
    return $str; 
} 

И я называю

$multibyte_string = "Portion of Chicken for 1 person<br>一人份鸡肉"; 

echo neat_trim($multibyte_string,42) . "</br>"; 

будет производить

Portion of Chicken for 1 person 
一人�... 

К сожалению, он не будет работать на PHP-5.4.29, он будет производить:

... 

Я пробовал this и this, но не работал. Пожалуйста помоги.

+1

Если это * UTF-8 * 1.) '$ LEN = StrLen ($ НТР);' использовать 'mb_strlen ($ ул , "utf-8"); 'длина символа ** 40 ** не ** 50 ** [расширение mbstring] (http://php.net/manual/en/book.mbstring.php). 2.) Если это юникод, используйте 'u' [flag] (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) и, возможно, также' '' flag в вашем регулярном выражении для создания точка также соответствует новостям: ''/(. {'. $ n.'}. *?) \ b/us'' –

+0

Спасибо @Jonny, ваш комментарий действительно мне помогает. Я новичок в работе с несколькими символами в PHP. Я опубликовал свой рабочий код. –

+0

Ответы идут в окне ответа ниже, а не в вопросе. –

ответ

1

Работа код, основанный на @ комментарий Jonny, в еще раз спасибо

function neat_trim($str, $n, $delim='...') 
{ 
    $len = mb_detect_encoding($str) == "UTF-8" ? mb_strlen($str, "UTF-8") : strlen($str); 
    if ($len > $n) 
    { 
     preg_match('/(.{' . $n . '}.*?)\b/us', $str, $matches); 
     return rtrim($matches[1]) . $delim; 
    } 
    return $str; 
}