Raccourcir le texte sans fractionnement des mots ou de la rupture de balises html
Je suis en train de couper du texte après 236 caractères sans couper les mots en deux et la préservation des balises html. C'est ce que j'utilise en ce moment:
$shortdesc = $_helper->productAttribute($_product, $_product->getShortDescription(), 'short_description');
$lenght = 236;
echo substr($shortdesc, 0, strrpos(substr($shortdesc, 0, $lenght), " "));
Tout cela fonctionne dans la plupart des cas, il ne respecte pas les balises html. Ainsi, par exemple, ce texte:
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. <strong>Stet clita kasd gubergren</strong>
va me couper avec l'étiquette encore être ouvert. Est-il possible de couper un texte après 236 caractères, mais en respectant les balises html?
Quel est le résultat attendu ? Si vous voulez que le texte que vous pourrait priver les balises html ...
Vous devez utiliser un analyseur HTML[(php.net/manual/en/class.domdocument.php) pour cela, et compter tous les caractères dans textnode pour cela.
Supprimer les balises entièrement?
Google est une chose merveilleuse alanwhipple.com/2011/05/25/...
Essayez d'utiliser preg_split() pour fractionner le texte par tagged contenu.
Vous devez utiliser un analyseur HTML[(php.net/manual/en/class.domdocument.php) pour cela, et compter tous les caractères dans textnode pour cela.
Supprimer les balises entièrement?
preg_replace ("<[^>]*>", "", $shortdesc)
Google est une chose merveilleuse alanwhipple.com/2011/05/25/...
Essayez d'utiliser preg_split() pour fractionner le texte par tagged contenu.
OriginalL'auteur loeffel | 2013-05-16
Vous devez vous connecter pour publier un commentaire.
Cela devrait le faire:
À utiliser comme:
$str = Html::trim($str, 236);
(démo ici)
Certaines comparaisons de performance entre les ce et les regex solution
Il y a très peu de différence, et à de très grandes tailles de corde, DomDocument est effectivement plus rapide. La fiabilité est plus important que de sauver quelques microsecondes à mon avis.
if(isset($node->childNodes))
àif ( $node->hasChildNodes())
C'est vraiment une bonne solution, je vous remercie!
Ne fonctionne pas pour l'Unicode pour moi, même lors de l'utilisation de mb_strlen() / mb_substr() comme le suggère.
utf8_decode semble le faire @AlexWeinstein
OriginalL'auteur nice ass
Meilleure solution que j'ai trouver pour ce qui est de le framework CakePHP TextHelper classe
Ici est la méthode
D'autres cadres similaires (ou autre) des solutions à ce problème, alors vous pourriez jeter un oeil à eux aussi. Ma familiarité avec le Gâteau est ce qui a incité mon lien vers leur solution
Edit:
Viens de tester cette méthode dans une application que je suis en train de travailler sur les OP du texte
De sortie:
Avis, la sortie s'arrête juste de remplir le dernier mot, mais inclut l'forte tags
C'est une bonne fonction, mais je pense que le CakePHP-Funktion est conçu pour tronquer les choses écrites dans la bd, pas un texte qui contient un grand nombre d'entités, il tronque la représentation ne pas les caractères visibles dans le code HTML de sortie, l'utilisateur voit. À moins qu'il n'a changer dans le temps où j'ai regardé la dernière.
cette méthode est à partir de la TextHelper utilisées dans les vues et n'a rien (vraiment) à voir avec la bd. C'est exactement le cas dans la question d'origine.
Cela a l'air vraiment prometteur, mais ici, c'est ce qui arrive à mon <strong> tag dans l'exemple donné: <stro... div="" <="">
Je sais que cette fonction et il a des problèmes avec le texte qui contient beaucoup de HTML-Entités. Le problème commence avec ce qu'il détermine la durée de la représentation, et non pas les caractères affichés. Si elle est destinée à Vue, il ne fonctionne pas lorsque le texte contient par exemple " ou Ꮊ
OriginalL'auteur fullybaked
Je peux juste donner une pensée ?
Exemple de texte :
Tout d'abord, analyser dans:
puis couper le texte un par un, et envelopper chacun avec son étiquette après la coupe,
ensuite se joindre à eux.
bien sûr, vous pouvez utiliser la méthode similaire à traiter avec des balises imbriquées, mais vous n'avez pas dire que vous devez traiter avec des balises imbriquées dans votre question
Pas à ma question. Mais d'après mon expérience, lorsque l'on travaille sur des trucs comme ça toujours garder à l'esprit des choses comme la nidification à l'avance.
OriginalL'auteur Phoenix
Remarque: Il peut y avoir une meilleure façon de fermer les balises au lieu d'utiliser
DOMDocument
. Par exemple, nous pouvons utiliser unp tag
à l'intérieur d'unh1 tag
et il est toujours présent travail. Mais dans ce cas, la balise d'en-tête va fermer avant lap tag
parce que, théoriquement, il n'est pas possible d'utiliserp tag
à l'intérieur. Alors, soyez prudent pour le HTML strict des normes.OriginalL'auteur enenen
Je l'ai fait en JS, espérons que cette logique d'aide en PHP aussi..
Espère que cette logique de l'aide à quelqu'un..
OriginalL'auteur Dilip Rajkumar
Seulement avec une regex, j'utilise (en nodeJS, mais nous ne se soucient pas de la langue) :
Il remplacera tous les personnages, sans couper les balises, et la suppression de dernier espace.
De travail, par exemple, avec des balises comme
<br />
, il ne sera pas coupé...Remarque: Il ne sera pas fermer toutes les balises ouvertes, il n'est pas dans ma demande initiale
OriginalL'auteur Adrien Parrochia
Vous pouvez prendre une approche XML et de pousser les éléments d'une chaîne de caractères var jusqu'à ce que la longueur de la chaîne dépasser 236
exemple de code ?
pour l'analyse de HTML en PHP http://simplehtmldom.sourceforge.net/
OriginalL'auteur b4n92uid
Voici JS solution: garniture-html
L'idée est de séparer la chaîne HTML de cette façon pour avoir un tableau avec des éléments en cours de balise html(ouvert ou fermé) ou tout simplement les cordes.
Que nous pouvons itérer tableau et compter les caractères.
merci pour la suggestion, je pense que le code est de gros à coller ici, j'ai ajouté l'idée derrière tout cela.
OriginalL'auteur Brankodd