2010-01-28 8 views
7

staram się dostać tę metodę w pracy filtru String:Obciąć wielobajtowego String do n znaków

public function truncate($string, $chars = 50, $terminator = ' …'); 

bym tego spodziewać

$in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890"; 
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …"; 

a także to

$in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ"; 
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …"; 

To jest $chars minus znaki z ciągu $terminator.

Ponadto filtr powinien wycinać pierwszą granicę słowa poniżej limitu $chars, np.

$in = "Answer to the Ultimate Question of Life, the Universe, and Everything."; 
$out = "Answer to the Ultimate Question of Life, the …"; 

Jestem całkiem pewien, że to powinno działać z tych etapów

  • kwotę odjąć od znaków w terminatora z maksymalnymi znaków
  • potwierdzić, że łańcuch jest dłuższy niż obliczonego ograniczenia lub zwrócić niezmienioną
  • znajdź ostatni znak spacji w łańcuchu poniżej obliczonego limitu, aby uzyskać granicę słowa
  • wyciąć ciąg na ostatniej spacji lub obliczony limit, jeśli nie ma ostatniego spacji
  • dołączyć terminator ciąg
  • powrót strun

Jednak próbowałem różne kombinacje str* i mb_* funkcji teraz, ale wszystko dało błędne wyniki. To nie może być takie trudne, więc oczywiście brakuje mi czegoś. Czy ktoś udostępnił działającą implementację tego lub wskazał mi źródło, w którym mogę w końcu zrozumieć, jak to zrobić.

Dzięki

P.S. Tak, sprawdziłem przed https://stackoverflow.com/search?q=truncate+string+php :)

+0

Możesz znaleźć ['s ($ str) -> truncateSafely (50)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L246) pomocne, jak znaleźć w [tej samodzielnej bibliotece] (https://github.com/delight-im/PHP-Str). – caw

Odpowiedz

3

Spróbuj tego:

function truncate($string, $chars = 50, $terminator = ' …') { 
    $cutPos = $chars - mb_strlen($terminator); 
    $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' '); 
    return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator; 
} 

Ale trzeba upewnić się, że kodowanie wewnętrzny jest prawidłowo ustawiony.

+0

Doh, próbowałem sprawić, żeby działało zgodnie z ISO-8859-1. Zmieniono go teraz na UTF-8. Dzięki Gumbo. Akceptuję to jako poprawną odpowiedź, ponieważ zawiera jedyną rzecz, której mi brakowało. – Gordon

0

Zazwyczaj nie lubię po prostu zakodować całej odpowiedzi na takie pytanie. Ale też się obudziłem i pomyślałem, że może twoje pytanie sprawi, że będę w dobrym nastroju, aby przejść program przez resztę dnia.

Nie próbowałem tego uruchamiać, ale powinno działać lub przynajmniej uzyskać 90% drogi.

function truncate($string, $chars = 50, $terminate = ' ...') 
{ 
    $chars -= mb_strlen($terminate); 
    if ($chars <= 0) 
     return $terminate; 

    $string = mb_substr($string, 0, $chars); 
    $space = mb_strrpos($string, ' '); 

    if ($space < mb_strlen($string)/2) 
     return $string . $terminate; 
    else 
     return mb_substr($string, 0, $space) . $terminate; 
} 
5

Właśnie okazało się, PHP ma już wielobajtowej obciąć z

To nie przestrzega granic słów chociaż. Ale przydatny niemniej!

Powiązane problemy