J'ai un extrait de code écrit en PHP qui extrait un bloc de texte d'une base de données et l'envoie à un widget sur une page Web. Le bloc de texte original peut être un long article ou une courte phrase ou deux; mais pour ce widget, je ne peux pas afficher plus de, disons, 200 caractères. Je pourrais utiliser substr () pour couper le texte à 200 caractères, mais le résultat serait de couper au milieu des mots - ce que je veux vraiment, c'est couper le texte à la fin du dernier mot avant 200 caractères.
183
s($str)->truncateSafely(200)
utile, comme trouvé dans cette bibliothèque autonome .Réponses:
En utilisant la fonction Wordwrap . Il divise les textes en plusieurs lignes de telle sorte que la largeur maximale soit celle que vous avez spécifiée, en se coupant aux limites des mots. Après le fractionnement, vous prenez simplement la première ligne:
Une chose que cet oneliner ne gère pas est le cas où le texte lui-même est plus court que la largeur souhaitée. Pour gérer ce cas de bord, on devrait faire quelque chose comme:
La solution ci-dessus pose le problème de couper prématurément le texte s'il contient une nouvelle ligne avant le point de coupure réel. Voici une version qui résout ce problème:
Aussi, voici la classe de test PHPUnit utilisée pour tester l'implémentation:
ÉDITER :
Les caractères UTF8 spéciaux tels que «à» ne sont pas gérés. Ajoutez 'u' à la fin du REGEX pour le gérer:
$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);
la source
\n
avant la largeur souhaitée.Arabic
lettres et il est réduit aux mots corrects maintenant avec l'aide de latokenTruncate
fonction .. tnx un million :)Cela renverra les 200 premiers caractères des mots:
la source
if (strlen($string) > $your_desired_width) { preg_replace(...); }
/\s+?(?:\S+)?$/
Et là vous l'avez - une méthode fiable pour tronquer n'importe quelle chaîne au mot entier le plus proche, tout en restant sous la longueur de chaîne maximale.
J'ai essayé les autres exemples ci-dessus et ils n'ont pas produit les résultats escomptés.
la source
if
déclaration:if (strlen($str) > 200) { ... }
$WidgetText = substr($string, 0, strpos($string, ' ', 200));
La solution suivante est née lorsque j'ai remarqué un paramètre $ break de la fonction wordwrap :
Voici la solution :
Exemple 1.
L'exemple ci-dessus affichera:
Exemple n ° 2.
L'exemple ci-dessus affichera:
la source
description
de blog)preg_replace('/\s+/', ' ', $description)
pour remplacer tous les caractères d'espacement par un seul espace;)Gardez à l'esprit lorsque vous divisez par "mot" n'importe où que certaines langues telles que le chinois et le japonais n'utilisent pas de caractère espace pour séparer les mots. En outre, un utilisateur malveillant pourrait simplement entrer du texte sans espaces, ou utiliser un aspect Unicode similaire au caractère d'espace standard, auquel cas toute solution que vous utilisez peut finir par afficher le texte entier de toute façon. Une façon de contourner cela peut être de vérifier la longueur de la chaîne après l'avoir divisée sur des espaces comme d'habitude, puis, si la chaîne est toujours au-dessus d'une limite anormale - peut-être 225 caractères dans ce cas - continuez et divisez-la bêtement à cette limite.
Une autre mise en garde avec des choses comme celle-ci lorsqu'il s'agit de caractères non ASCII; les chaînes les contenant peuvent être interprétées par strlen () standard de PHP comme étant plus longues qu'elles ne le sont réellement, car un seul caractère peut prendre deux octets ou plus au lieu d'un seul. Si vous utilisez simplement les fonctions strlen () / substr () pour fractionner des chaînes, vous pouvez fractionner une chaîne au milieu d'un caractère! En cas de doute, mb_strlen () / mb_substr () sont un peu plus infaillibles.
la source
Utilisez strpos et substr:
Cela vous donnera une chaîne tronquée au premier espace après 30 caractères.
la source
Voici:
la source
Voici ma fonction basée sur l'approche de @ Cd-MaN.
la source
La description:
^
- commencer au début de la chaîne([\s\S]{1,200})
- obtenez de 1 à 200 de n'importe quel caractère[\s]+?
- ne pas inclure d'espaces à la fin du texte court afin que nous puissions éviterword ...
au lieu deword...
[\s\S]+
- correspond à tous les autres contenusTests:
regex101.com
ajoutons àor
quelques autresr
regex101.com
orrrr
exactement 200 caractères.regex101.com
après cinquièmer
orrrrr
exclu.Prendre plaisir.
la source
$1
est un "remplacement", mais dans ce contexte spécifique à quoi fait-il référence ?? une variable vide?$1
référant à la correspondance entre crochets([\s\S]{1,200})
.$2
fera référence à deux secondes paires de crochets s'il y en a dans le modèle.Il est surprenant de voir à quel point il est difficile de trouver la solution parfaite à ce problème. Je n'ai pas encore trouvé de réponse sur cette page qui n'échoue pas dans au moins certaines situations (surtout si la chaîne contient des retours à la ligne ou des tabulations, ou si le mot break est autre chose qu'un espace, ou si la chaîne a UTF- 8 caractères multi-octets).
Voici une solution simple qui fonctionne dans tous les cas. Il y avait des réponses similaires ici, mais le modificateur "s" est important si vous voulez qu'il fonctionne avec une entrée multiligne, et le modificateur "u" lui permet d'évaluer correctement les caractères multioctets UTF-8.
Un cas de bord possible avec ceci ... si la chaîne ne contient aucun espace dans les premiers caractères $ characterCount, elle renverra la chaîne entière. Si vous préférez qu'il force une rupture à $ characterCount même s'il ne s'agit pas d'une limite de mot, vous pouvez utiliser ceci:
Une dernière option, si vous voulez qu'elle ajoute des points de suspension si elle tronque la chaîne ...
la source
J'utiliserais la fonction preg_match pour ce faire, car ce que vous voulez est une expression assez simple.
L'expression signifie "correspond à toute sous-chaîne commençant au début de la longueur 1-200 qui se termine par un espace." Le résultat est dans $ result et la correspondance est dans $ matches. Cela prend en charge votre question initiale, qui se termine spécifiquement sur n'importe quel espace. Si vous voulez que cela se termine sur les nouvelles lignes, remplacez l'expression régulière par:
la source
Ok donc j'ai une autre version de ceci basée sur les réponses ci-dessus mais en tenant compte de plus de choses (utf-8, \ n et & nbsp;), aussi une ligne dépouillant les shortcodes wordpress commentés s'ils sont utilisés avec wp.
la source
Voici une petite solution pour la réponse de mattmac:
La seule différence est d'ajouter un espace à la fin de $ string. Cela garantit que le dernier mot n'est pas coupé selon le commentaire de ReX357.
Je n'ai pas assez de points de répétition pour ajouter ceci en commentaire.
la source
Usage:
Cela produira les 10 premiers mots.
La
preg_split
fonction est utilisée pour diviser une chaîne en sous-chaînes. Les limites le long desquelles la chaîne doit être divisée sont spécifiées à l'aide d'un modèle d'expressions régulières.preg_split
La fonction prend 4 paramètres, mais seuls les 3 premiers sont pertinents pour nous en ce moment.Premier paramètre - Modèle Le premier paramètre est le modèle d'expressions régulières le long duquel la chaîne doit être divisée. Dans notre cas, nous voulons diviser la chaîne à travers les limites des mots. Par conséquent, nous utilisons une classe de caractères prédéfinie
\s
qui correspond aux caractères d'espace blanc tels que l'espace, la tabulation, le retour chariot et le saut de ligne.Deuxième paramètre - Chaîne d'entrée Le deuxième paramètre est la longue chaîne de texte que nous voulons diviser.
Troisième paramètre - Limite Le troisième paramètre spécifie le nombre de sous-chaînes à renvoyer. Si vous définissez la limite sur
n
, preg_split renverra un tableau de n éléments. Les premiersn-1
éléments contiendront les sous-chaînes. Le dernier(n th)
élément contiendra le reste de la chaîne.la source
Basé sur l'expression régulière de @Justin Poliey:
la source
J'ai une fonction qui fait presque ce que vous voulez, si vous faites quelques modifications, elle s'adaptera exactement:
la source
Voici comment je l'ai fait:
la source
Je sais que c'est vieux, mais ...
la source
Je crée une fonction plus similaire à substr, et en utilisant l'idée de @Dave.
Ps.: La longueur totale de la coupe peut être inférieure à substr.
la source
Ajout d'instructions IF / ELSEIF au code de Dave et AmalMurali pour gérer les chaînes sans espaces
la source
Je trouve que cela fonctionne:
function abbreviate_string_to_whole_word ($ string, $ max_length, $ buffer) {
}
Le tampon vous permet d'ajuster la longueur de la chaîne renvoyée.
la source
Utilisez ceci:
le code suivant supprimera ','. Si vous avez un autre caractère ou sous-chaîne, vous pouvez l'utiliser à la place de ','
// si vous avez un autre compte chaîne pour
la source
Bien que ce soit une question plutôt ancienne, j'ai pensé que je fournirais une alternative, car elle n'était pas mentionnée et valable pour PHP 4.3+.
Vous pouvez utiliser la
sprintf
famille de fonctions pour tronquer du texte, en utilisant le%.ℕs
modificateur de précision.Troncature simple https://3v4l.org/QJDJU
Résultat
Troncature étendue https://3v4l.org/FCD21
Puisque
sprintf
fonctionne de la même manièresubstr
et coupera partiellement les mots. L'approche ci-dessous garantira que les mots ne sont pas coupés en utilisantstrpos(wordwrap(..., '[break]'), '[break]')
un délimiteur spécial. Cela nous permet de récupérer la position et de nous assurer que nous ne correspondons pas aux structures de phrases standard.Renvoyer une chaîne sans couper partiellement les mots et qui ne dépasse pas la largeur spécifiée, tout en préservant les sauts de ligne si vous le souhaitez.
Résultat
Résultats utilisant
wordwrap($string, $width)
oustrtok(wordwrap($string, $width), "\n")
la source
Je l'ai utilisé avant
la source
Ici vous pouvez essayer ceci
la source
Je pense que c'est le moyen le plus simple de le faire:
J'utilise les caractères spéciaux pour diviser le texte et le couper.
la source
Peut-être que cela aidera quelqu'un:
la source