Comment puis-je obtenir les n premiers caractères d'une chaîne en PHP? Quel est le moyen le plus rapide de couper une chaîne à un nombre spécifique de caractères et d’ajouter "..." si nécessaire?
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Mise à jour:
Sur la base de suggestions pour vérifier la longueur (et également pour assurer des longueurs similaires sur les chaînes coupées et non coupées):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Ainsi, vous obtiendrez une chaîne de 13 caractères maximum; soit 13 (ou moins) caractères normaux ou 10 caractères suivis de '...'
Mise à jour 2:
Ou comme fonction:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Mise à jour 3:
Cela fait un moment que j'ai écrit cette réponse et je n'utilise plus ce code. Je préfère cette fonction qui empêche la rupture de la chaîne au milieu d'un mot en utilisant la fonction wordwrap
:
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
Cette fonctionnalité est intégrée à PHP depuis la version 4.0.6. Voir la documentation .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Notez que les trimmarker
(les Ellipsis ci-dessus) sont inclus dans la longueur tronquée.
L'extension multi-octets peut s'avérer utile si vous avez besoin de contrôler le jeu de caractères string.
$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
parfois, vous devez limiter la chaîne au dernier mot complet, c'est-à-dire que vous ne voulez pas que le dernier mot soit brisé, mais que vous vous arrêtez au dernier dernier mot.
par exemple: nous devons limiter "This is my String" à 6 caractères, mais au lieu de "This i ...", nous voulons que ce soit "This ...", c'est-à-dire que nous ignorerons les lettres brisées dans le dernier mot.
ouf, j'ai du mal à expliquer, voici le code.
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $Word) {
if ((strlen($Word) > $len) && $out == null) {
return substr($Word, 0, $len) . "...";
}
if ((strlen($out) + strlen($Word)) > $len) {
return $out . "...";
}
$out.=" " . $Word;
}
return $out;
}
}
Si vous voulez couper en prenant soin de ne pas séparer les mots, vous pouvez procéder comme suit:
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$buff=strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
si $ str est plus court que $ n_chars le retourne intact.
Si $ str est égal à $ n_chars, il le retourne tel quel.
si $ str est plus long que $ n_chars, il cherche le prochain espace à couper ou (s'il n'y a plus d'espace jusqu'à la fin), $ str est coupé brutalement à la place de $ n_chars.
NOTE: sachez que cette méthode supprimera toutes les balises dans le cas de HTML.
Le framework codeigniter contient pour cela une assistance, appelée "assistant de texte". Voici une documentation du guide de l'utilisateur de codeigniter qui s'applique: http://codeigniter.com/user_guide/helpers/text_helper.html (il suffit de lire les sections Word_limiter et character_limiter). Voici deux fonctions pertinentes pour votre question:
if ( ! function_exists('Word_limiter'))
{
function Word_limiter($str, $limit = 100, $end_char = '…')
{
if (trim($str) == '')
{
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0]))
{
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
Et
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
Utiliser une sous-chaîne
http://php.net/manual/en/function.substr.php
$foo = substr("abcde",0, 3) . "...";
if(strlen($text) > 10)
$text = substr($text,0,10) . "...";
Il est préférable d’abstraire votre code comme suit (notez que la limite est facultative et que la valeur par défaut est 10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
Je ne suis pas sûr que ce soit la solution la plus rapide, mais il semble que ce soit la plus courte:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
P.S. Voir quelques exemples ici https://stackoverflow.com/a/17852480/131337
C'est ce que je fais
function cutat($num, $tt){
if (mb_strlen($tt)>$num){
$tt=mb_substr($tt,0,$num-2).'...';
}
return $tt;
}
où $ num représente le nombre de caractères et $ tt la chaîne à manipuler.
Pour créer dans une fonction (pour un usage répété) et une longueur limitée dynamique, utilisez:
function string_length_cutoff($string, $limit, $subtext = '...')
{
return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}
// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);
// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
J'ai développé une fonction pour cet usage
function str_short($string,$limit)
{
$len=strlen($string);
if($len>$limit)
{
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);
return $crop_len=$crop_temp."...";
}
else
{
return $string;
}
}
vous appelez juste la fonction avec string et limite
Exemple: str_short("hahahahahah",5)
;
il coupera votre ficelle et ajoutera "..." à la fin
:)
La fonction que j'ai utilisée:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Voir en action .
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
while(strlen($yourString) > 22) {
$pos = strrpos($yourString, " ");
if($pos !== false && $pos <= 22) {
$out = substr($yourString,0,$pos);
break;
} else {
$yourString = substr($yourString,0,$pos);
continue;
}
}
} else {
$out = $yourString;
}
echo "Output String: ".$out;
substr () serait préférable, vous voudrez également vérifier la longueur de la chaîne en premier
$str = 'someLongString';
$max = 7;
if(strlen($str) > $max) {
$str = substr($str, 0, $max) . '...';
}
wordwrap ne coupe pas la chaîne, mais la scinde ...
cette solution ne coupera pas les mots, elle ajoutera trois points après le premier espace. J'ai édité la solution @ Raccoon29 et j'ai remplacé toutes les fonctions par mb _ afin que cela fonctionne dans toutes les langues telles que l'arabe
function cut_string($str, $n_chars, $crop_str = '...') {
$buff = strip_tags($str);
if (mb_strlen($buff) > $n_chars) {
$cut_index = mb_strpos($buff, ' ', $n_chars);
$buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
}
return $buff;
}
$ width = 10;
$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);
ou avec wordwrap
$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);