8768 sujets

Développement web côté serveur, CMS

Bonjour,

je n'ai pas trouvé dans PHP une fonction similaire à substr qui permet d'extraire une portion de chaine sans couper les mots, c'est à dire en s'arrêtant au dernier mot entier.

J'en ai créé une mais je ne sais pas si c'est la meilleure solution ni la plus simple, je vous laisse juger:

J'appelle la fonction avec extract_whole_words($ma_chaine, 299) par exemple et il me retourne tous les mots entiers avant le 300 ème caractère.




// extraire chaine de mots entiers  
function extract_whole_words($string, $length)  {
	$new_string = $string;
	for($i = $length; $i > 0; $i--)  {
	  if ( " " == substr($string, $i, 1)) { 
		  $new_string = substr($string, 0, $i) . "...";
		  break;
		  } 	
	}
	return $new_string;
}

Hello,

je pense que j'aurai plutôt fait cela en deux temps perso :
1/ Je coupe ma chaine au nombre de caractère souhaité, 299 dans ton exemple, en vérifiant que si j'ai coupé un mot, je le supprime

Comme ça il te reste juste ta chaine avec les mots à extraire

2/ tu n'a plus qu'à utiliser la fonction explode pour récupérer dans un tableau tout les mots de la chaine
Voici ma version. Elle fait l'inverse des vôtres par contre, c'est-à-dire qu'elle étend la chaîne au-delà du nième caractère au lieu de la raccourcir.


function substrWholeWords ($s, $n) {
$l = strlen($s);
if ($l<$n) return $s;
while($n<$l && false===strpos(" \r\n\t", $s[$n])) $n++;
return substr($s, 0, $n).'...';
}


A mon avis elle est légèrement plus rapide que ta version initiale, car elle ne fait qu'un seul appel à substr, contre n; mais peut-être que je me trompe, je n'ai pas essayé de faire un bencmark pour le prouver.
Au temps pour moi, je n'avais pas bien compris ta demande !

Tu peux adapter la fonction de Quentin pour arrêter la chaine au mot précédant la longueur voulue :


function substrWholeWords2($s, $n){
$l = strlen($s);
if ($l<$n) return $s;
while($n>0 && false===strpos(" \r\n\t", $s[$n])) $n--;
return substr($s, 0, $n).'...';
}