2012-01-31 12 views
40

Aquí es simple códigofunción PHP substr() con UTF-8 deja marcas en el extremo

<?php 

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

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

echo $foo; 
?> 

y se da salida a algo como esto:

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

Probé mb_substr() sin suerte. ¿Cómo hacer esto de la manera correcta?

+0

'mb_substr()' es el camino a seguir, esto sucede cuando un personaje de varios bytes se corta a la mitad. ¿Puedes mostrar lo que probaste con eso y cómo falló? –

+3

¿Especificó la codificación (último parámetro) cuando intentó 'mb_substr'? –

+0

Eso es exactamente lo que traté de hacer. No lo tengo en Internet, así que no puedo proporcionar el enlace. Es una larga descripción de la compañía, que recorté para tener 142 caracteres de largo para mostrar en la página de inicio de un sitio web. – Nazar

Respuesta

81

Los comentarios anteriores son correctos siempre que tenga mbstring habilitado en su servidor.

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

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

Aquí está la documentación PHP:

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

+0

¡Gracias! El último argumento que eché de menos fue "UTF-8", aunque revisé la documentación. – Nazar

3

PHP5 no comprende UTF-8 de forma nativa. Se propone para PHP6, si alguna vez sale.

Utilice multibyte string functions para manipular cadenas UTF-8 de forma segura.

Por ejemplo, mb_substr() en su caso.

4

Una alternativa adecuada (lógico) para cadenas 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 
?> 

Utilice la PHP: mb_substr - Manual

+0

'mb_substr ($ str, $ s, $ l, 'UTF-8')' es la verdadera alternativa correcta ...! Sin un conjunto de caracteres correctamente especificado, es un crapshoot el resultado. – deceze

2

Nunca use constante en función substr para la cadena UTF-8: $ st = substr ($ texto, $ BEG, 100); 50% de probabilidad de que obtendrá la mitad de un personaje al final de la cadena)

hacer como esto:

$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% resultado

Sin mb_substr

+0

Genial si sabes qué caracteres quieres cortar. Si quieres tener solo, digamos los primeros 3 caracteres de una cadena aleatoria, no es bueno. La forma correcta es con mb_substr. – Eir

0

espero que esta solución ayuda que como me ayudó mucho.

<?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)); 
} 
?> 
Cuestiones relacionadas