2012-07-11 15 views
72

Mam pole opisu w mojej bazie danych MySQL i mam dostęp do bazy danych na dwóch różnych stronach, jedna strona wyświetla całe pole, ale z drugiej strony, chcę tylko wyświetl pierwszych 50 znaków. Jeśli napis w polu opisu ma mniej niż 50 znaków, to nie wyświetli ..., ale jeśli nie, pokażę ... po pierwszych 50 znakach.Dodaj ... jeśli ciąg jest za długi PHP

Przykład (Full string):

Hello, this is the first example, where I am going to have a string that is over 50 characters and is super long, I don't know how long maybe around 1000 characters. Anyway this should be over 50 characters now ... 

Exmaple 2 (pierwsze 50 znaków):

Hello, this is the first example, where I am going ... 
+1

możliwe duplikat [PHP - wyciąć ciąg znaków po x] (http://stackoverflow.com/questions/3161816/php-cut-a-string-after-x-characters) – iconoclast

+0

Chcę tylko podkreślić, że wielokropek jest znakiem: "..."! = "..." i reprezentowany jako & hellip; –

+0

MySQL oferuje możliwość PODŁOŻENIA twoich pól, a dla elipsy możesz użyć przypadku jako: select (przypadek, gdy DŁUGOŚĆ (pole)> 50 to KONCAT (PODŁOŻA (pole, 1, 47), "...") koniec pola) ... – MediaVince

Odpowiedz

212

Sposób PHP w ten sposób jest prosty:

$out = strlen($in) > 50 ? substr($in,0,50)."..." : $in; 

Ale ty można osiągnąć o wiele lepszy efekt dzięki temu CSS:

.ellipsis { 
    overflow: hidden; 
    white-space: nowrap; 
    text-overflow: ellipsis; 
} 

Teraz, zakładając, że element ma stałą szerokość, przeglądarka automatycznie się wyłączy i doda do ciebie ....

+9

+1 Dla CSS alternatywy – Tchoupi

+2

Myślę, że sposób css zwiększy przesyłane dane, niepotrzebne dla przeglądarek mobilnych. Co więcej, wysyłasz pełny tekst, a czasami nie powinno być dostępne. – szamil

+8

Głównym problemem, który napotkałem przy alternatywnym CSS, jest to, że nie działa w przypadku multilinii. Jeśli twoje 50 znaków obejmuje więcej niż 2 linie, dobrze, pożegnaj się z drugą linią. Chyba że istnieje alternatywa, której jeszcze nie znalazłem? * Nadzieje * –

11
if (strlen($string) <=50) { 
    echo $string; 
} else { 
    echo substr($string, 0, 50) . '...'; 
} 
2
<?php 
function truncate($string, $length, $stopanywhere=false) { 
    //truncates a string to a certain char length, stopping on a word if not specified otherwise. 
    if (strlen($string) > $length) { 
     //limit hit! 
     $string = substr($string,0,($length -3)); 
     if ($stopanywhere) { 
      //stop anywhere 
      $string .= '...'; 
     } else{ 
      //stop on a word. 
      $string = substr($string,0,strrpos($string,' ')).'...'; 
     } 
    } 
    return $string; 
} 
?> 

Używam powyższy fragment kodu wiele-a-krotnie ..

1
<?php 
$string = 'This is your string'; 

if(strlen($string) > 50) { 
    $string = substr($string, 0, 50) . '...'; 
} 

to wszystko.

25

Zastosowanie wordwrap() obciąć ciąg bez zerwania słowa jeśli ciąg jest dłuższa niż 50 znaków, i po prostu dodać ... na koniec:

$str = $input; 
if(strlen($input) > 50) { 
    $str = explode("\n", wordwrap($input, 50)); 
    $str = $str[0] . '...'; 
} 

echo $str; 

W przeciwnym razie, za pomocą rozwiązań, które substr($input, 0, 50); złamie słowa.

+0

To również jest dobre rozwiązanie, więc nie muszę łamać słów ... Dzięki. –

+0

Dobrze, dziękuję! –

+2

Pamiętaj, że wordwrap nie działa z wielobajtowymi znakami i nie ma zapakowanej funkcji mb_wordwrap. – MarcGuay

1
$string = "Hello, this is the first example, where I am going to have a string that is over 50 characters and is super long, I don't know how long maybe around 1000 characters. Anyway this should be over 50 characters know..."; 

if(strlen($string) >= 50) 
{ 
    echo substr($string, 50); //prints everything after 50th character 
    echo substr($string, 0, 50); //prints everything before 50th character 
} 
0

Można użyć str_split() tego

$str = "Hello, this is the first example, where I am going to have a string that is over 50 characters and is super long, I don't know how long maybe around 1000 characters. Anyway this should be over 50 characters know..."; 
$split = str_split($str, 50); 
$final = $split[0] . "..."; 
echo $final; 
105

można osiągnąć pożądany wykończenia w ten sposób TOO:

mb_strimwidth("Hello World", 0, 10, "..."); 

Gdzie:

  • Hello World: ciąg przycinać.
  • 0: liczba znaków od początku napisu.
  • 10: długość przyciętego napisu.
  • ...: dodany ciąg na końcu przyciętego napisu.

To zwróci Hello W....

Zauważ, że 10 to długość obciętego napisu + dodany ciąg!

Dokumentacja: http://php.net/manual/en/function.mb-strimwidth.php

+3

Zdecydowanie najłatwiejsze rozwiązanie, gdy CSS nie jest opcją. – Guillochon

+4

Eleganckie rozwiązanie. Jak widać w [tych uwagach] (http://php.net/manual/en/function.define.php). Aby uniknąć spacji między tekstem obciętym a wielokropkiem, możesz użyć polecenia rtrim (mb_strimwidth ($ string, 0, 24)). "..." –

+1

Najlepsza opcja IMHO jako CSS jest świetna, ale dla AJAX czasami chcesz wymieniać najmniejsze możliwe dane! – MediaVince

2

używam tego rozwiązania na mojej stronie internetowej. Jeśli $ str jest krótszy niż $ max, pozostanie niezmieniony. Jeśli $ str nie ma spacji wśród pierwszych znaków maks. $, Zostanie brutalnie obcięte na pozycji $ max. W przeciwnym razie po ostatnim pełnym słowie zostaną dodane 3 kropki.

function short_str($str, $max = 50) { 
    $str = trim($str); 
    if (strlen($str) > $max) { 
     $s_pos = strpos($str, ' '); 
     $cut = $s_pos === false || $s_pos > $max; 
     $str = wordwrap($str, $max, ';;', $cut); 
     $str = explode(';;', $str); 
     $str = $str[0] . '...'; 
    } 
    return $str; 
} 
1

ten powróci dany ciąg z wielokropkiem w oparciu o wyrazów zamiast znaków:

<?php 
/** 
* Return an elipsis given a string and a number of words 
*/ 
function elipsis ($text, $words = 30) { 
    // Check if string has more than X words 
    if (str_word_count($text) > $words) { 

     // Extract first X words from string 
     preg_match("/(?:[^\s,\.;\?\!]+(?:[\s,\.;\?\!]+|$)){0,$words}/", $text, $matches); 
     $text = trim($matches[0]); 

     // Let's check if it ends in a comma or a dot. 
     if (substr($text, -1) == ',') { 
      // If it's a comma, let's remove it and add a ellipsis 
      $text = rtrim($text, ','); 
      $text .= '...'; 
     } else if (substr($text, -1) == '.') { 
      // If it's a dot, let's remove it and add a ellipsis (optional) 
      $text = rtrim($text, '.'); 
      $text .= '...'; 
     } else { 
      // Doesn't end in dot or comma, just adding ellipsis here 
      $text .= '...'; 
     } 
    } 
    // Returns "ellipsed" text, or just the string, if it's less than X words wide. 
    return $text; 
} 

$description = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quibusdam ut placeat consequuntur pariatur iure eum ducimus quasi perferendis, laborum obcaecati iusto ullam expedita excepturi debitis nisi deserunt fugiat velit assumenda. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt, blanditiis nostrum. Nostrum cumque non rerum ducimus voluptas officia tempore modi, nulla nisi illum, voluptates dolor sapiente ut iusto earum. Esse? Lorem ipsum dolor sit amet, consectetur adipisicing elit. A eligendi perspiciatis natus autem. Necessitatibus eligendi doloribus corporis quia, quas laboriosam. Beatae repellat dolor alias. Perferendis, distinctio, laudantium? Dolorum, veniam, amet!'; 

echo elipsis($description, 30); 
?> 
Powiązane problemy