2012-01-31 10 views
40

Oto prosty kodphp substr() z UTF-8 pozostawia śladów na koniec

<?php 

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных  продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта."; 

$foo = substr($var,0,142); 

echo $foo; 
?> 

i wyprowadza coś takiego:

Бензин Офиси А.С. также производит все типы жира и смазок и их побочных продук ...

Próbowałem mb_substr() bez powodzenia. Jak to zrobić we właściwy sposób?

+0

'mb_substr()' jest drogą do zrobienia, dzieje się tak, gdy znak wielobajtowy zostaje przecięty na pół. Czy możesz pokazać, co próbowałeś z tym i jak się nie udało? –

+3

Czy określiłeś kodowanie (ostatni parametr) przy próbie 'mb_substr'? –

+0

Dokładnie to, co próbowałem zrobić. Nie mam tego w Internecie, więc nie mogę podać linku. Jest to długi opis firmy, którą wyciąłem na 142 znaki do wyświetlenia na stronie głównej jednej witryny. – Nazar

Odpowiedz

81

Powyższe komentarze są poprawne, o ile na serwerze jest włączone mbstring.

$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных  продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта."; 

$foo = mb_substr($var,0,142, "utf-8"); 

Oto docs PHP:

http://php.net/manual/en/book.mbstring.php

+0

Dziękujemy! Ostatnim argumentem, który przeoczyłem, był "UTF-8", kiedy przejrzałem dokumentację. – Nazar

3

PHP5 nie rozumie natywnie UTF-8. Proponowany jest dla PHP6, jeśli kiedykolwiek wyjdzie.

Skorzystaj z multibyte string functions, aby bezpiecznie manipulować ciągami UTF-8. Na przykład: mb_substr() w Twoim przypadku.

4

Właściwego (logiczne) alternatywa dla Unicode;

<?php 
function substr_unicode($str, $s, $l = null) { 
    return join("", array_slice(
     preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l)); 
} 

$str = "Büyük"; 
$s = 0; // start from "0" (nth) char 
$l = 3; // get "3" chars 
echo substr($str, $s, $l) ."\n"; // Bü 
echo mb_substr($str, $s, $l) ."\n"; // Bü 
echo substr_unicode($str, $s, $l); // Büy 
?> 

Użyj PHP: mb_substr - Manual

+0

'mb_substr ($ str, $ s, $ l, 'UTF-8')' jest prawdziwą właściwą alternatywą ...! Bez poprawnie określonego zestawu znaków jest to wynik, który jest wynikiem. – deceze

2

Nigdy nie używaj stała w funkcji substr dla UTF-8 wyrażenie: $ St = substr ($ tekst, $ BEG, 100); 50% szansa dostaniesz połowę znaku na końcu łańcucha)

nie podoba:

$postion_degin = strpos($text, $first_symbol); 
$postion_end = strpos($text, $last_symbol); 
$len = $postion_end - $postion_degin +1; 
$st = substr($text, $postion_degin, $len); 

100% wynik

Nie mb_substr

+0

Fajne, jeśli wiesz, które znaki chcesz wyciąć. Jeśli chcesz mieć tylko, powiedzmy pierwsze 3 znaki losowego ciągu, to nie jest dobrze. Prawidłowy sposób jest z mb_substr. – Eir

0

Mam nadzieję, że to rozwiązanie Ci pomóc ponieważ bardzo mi to pomogło.

<?php 
if(mb_strlen($post->post_content,'UTF-8')>200){ 
    $content= str_replace('\n', '', mb_substr(strip_tags($post-> post_content), 
          0, 200,'UTF-8')); 
    echo $content.'…'; 
}else{ 
    echo str_replace('\n', '', strip_tags($post->post_content)); 
} 
?>