{"id":1197,"date":"2011-05-06T12:35:31","date_gmt":"2011-05-06T11:35:31","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=1197"},"modified":"2015-08-28T20:16:15","modified_gmt":"2015-08-28T18:16:15","slug":"php-couper-une-phrase-sans-couper-un-mot","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/php-couper-une-phrase-sans-couper-un-mot","title":{"rendered":"PHP : Couper une phrase sans couper un mot"},"content":{"rendered":"<p>Ces derniers temps il m&rsquo;arrive souvent d&rsquo;avoir besoin de travailler des cha\u00eenes de caract\u00e8res pour des mises en pages pr\u00e9cises, pour ne pas dire complexes.<br \/>\nLors d&rsquo;un projet j&rsquo;ai eu \u00e0 faire ressortir le d\u00e9but d&rsquo;un extrait de page que je devais ins\u00e9rer dans un bloc, tout en conservant une deuxi\u00e8me partie de cet extrait plac\u00e9 \u00e0 la suite.<!--more--><\/p>\n<p>Un exemple \u00e9tant plus parlant, imaginez que le script ait pour but de placer le d\u00e9but de cet article que vous \u00eates en train de lire dans un cadre de taille r\u00e9duite. De cet extrait je dois en plus en faire ressortir le d\u00e9but de la phrase. La chose ressemblerait \u00e0 \u00e7a :<\/p>\n<blockquote><p><strong>Ces derniers temps il m&rsquo;arrive souvent d&rsquo;avoir besoin de travailler des cha\u00eenes de caract\u00e8res<\/strong> pour des mises en pages pr\u00e9cises, pour ne pas dire complexes.<br \/>\nLors d&rsquo;un projet j&rsquo;ai eu \u00e0 faire ressortir le d\u00e9but d&rsquo;un extrait de page [\u2026]<\/p><\/blockquote>\n<p>Pour corser l&rsquo;exercice, il \u00e9tait possible que ce contenu r\u00e9cup\u00e9r\u00e9 ait en plus une structure d\u00e9j\u00e0 existante (\u00e9l\u00e9ment <code>p<\/code>, <code>strong<\/code>, <code>a<\/code>, <code>blockquote<\/code>, etc.)<\/p>\n<p>Pour l&rsquo;exemple, on imaginera que la variable <code>$contenu<\/code> contient un article complet.<\/p>\n<h2>Premi\u00e8re m\u00e9thode : <code>mb_substr()<\/code>, <code>substr()<\/code> et <code>strrpos()<\/code><\/h2>\n<pre class=\"code\"><code class=\"language-php\">&lt;?php\r\n\/\/ cr\u00e9ation de la fonction curString \u00e0 4 param\u00e8tres\r\n\/\/ $string = la cha\u00eene tronquer\r\n\/\/ $start = le caract\u00e8re de d\u00e9part\r\n\/\/ $length = la longueur de la cha\u00eene (en caract\u00e8re)\r\n\/\/ $endStr = param\u00e8tre optionnel qui termine l'extrait ([\u2026] par d\u00e9faut)\r\nfunction cutString($string, $start, $length, $endStr = '[&amp;hellip]'){\r\n\t\/\/ si la taille de la chaine est inf\u00e9rieure ou \u00e9gale \u00e0 celle\r\n\t\/\/ attendue on la retourne telle qu'elle\r\n\tif( strlen( $string ) &lt;= $length ) return $string;\r\n\t\/\/ autrement on continue\r\n&nbsp;\r\n\t\/\/ permet de couper la phrase aux caract\u00e8res d\u00e9finis tout\r\n\t\/\/ en prenant en compte la taille de votre $endStr et en \r\n\t\/\/ re-pr\u00e9cisant l'encodage du contenu r\u00e9cup\u00e9r\u00e9\r\n\t$str = mb_substr( $string, $start, $length - strlen( $endStr ) + 1, 'UTF-8');\r\n\t\/\/ retourne la cha\u00eene coup\u00e9e avant la derni\u00e8re espace rencontr\u00e9e\r\n\t\/\/ \u00e0 laquelle s'ajoute notre $endStr\r\n\treturn substr( $str, 0, strrpos( $str,' ') ).$endStr;\r\n}\r\n\r\n$article = \"Ici tout mon article avec plein de balises partout !\";\r\n\r\n\/\/ nettoyage des balises du contenu\r\n$content = strip_tags( $article );\r\n\r\n\/\/ on coupe notre contenu pour la premi\u00e8re partie (en gras)\r\n$part1 = cutString($content, 0, 100, '');\r\n\r\n\/\/ on coupe le m\u00eame contenu pour avoir la deuxi\u00e8me partie\r\n\/\/ en partant du nombre de caract\u00e8res de la premi\u00e8re\r\n$part2 = cutString($content, strlen($part1)-1, 315)\r\n\r\n\/\/ on affiche notre code\r\necho '&lt;p&gt;';\r\necho '&lt;strong&gt;'.$part1.'&lt;\/strong&gt;';\r\necho $part2;\r\necho '&lt;\/p&gt;';\r\n?&gt;\r\n<\/code><\/pre>\n<p>Voil\u00e0 ! Beaucoup de commentaires mais pas beaucoup de code.<br \/>\nCette fonction a l&rsquo;avantage d&rsquo;\u00eatre customisable et adaptable pour un <abbr title=\"Content managing system\">CMS<\/abbr>. L&rsquo;id\u00e9al \u00e9tant de l&rsquo;avoir dans une page regroupant les fonctions communes de votre site web afin de la r\u00e9utiliser facilement.<br \/>\nIl vous sera facile de simplifier le code pr\u00e9sent\u00e9. Ici j&rsquo;ai volontairement multipli\u00e9 les lignes et les <code>echo<\/code> pour rendre le code plus lisible.<\/p>\n<h2>Deuxi\u00e8me m\u00e9thode : <code>wordwrap()<\/code><\/h2>\n<p><em>(mise \u00e0 jour du 09\/05\/2011)<\/em><br \/>\nL&rsquo;id\u00e9e m&rsquo;a \u00e9t\u00e9 introduite par <a title=\"L'antre de Dew (nouvelle fen\u00eatre)\" href=\"http:\/\/www.blup.fr\/\" target=\"_blank\">Dew<\/a>, mais au d\u00e9part je ne voyais pas bien comment l&rsquo;utiliser dans mon cas.<br \/>\nEn effet, initialement cette fonction sert \u00e0 manipuler cycliquement une cha\u00eene de caract\u00e8re en y introduisant un <em lang=\"en\">break<\/em>, un \u00e9l\u00e9ment servant de cassure.<br \/>\nVoil\u00e0 ce que \u00e7a peut donner :<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;?php\r\n$contenu = \"Lorem Elsass ipsum amet dui jetz gehts los leverwurscht non porta ac baeckeoffe ac bredele\";\r\n$text = wordwrap($contenu, 22, \"\r\n\", true);\r\necho $text;\r\n?&gt;\r\n<\/code><\/pre>\n<p>Affichera :<\/p>\n<blockquote><p>Lorem Elsass ipsum<br \/>\namet dui jetz gehts<br \/>\nlos leverwurscht non<br \/>\nporta ac baeckeoffe ac<br \/>\nbredele<\/p><\/blockquote>\n<p>En voyant \u00e7a je me suis dit que \u00e7a pouvait effectivement \u00eatre une bonne fonction, mais que dans mon cas je ne voyais pas trop l&rsquo;utilit\u00e9.<br \/>\nMais en r\u00e9fl\u00e9chissant un peu, j&rsquo;ai finalement d\u00e9tourn\u00e9 le fameux <em lang=\"en\">break<\/em> pour faire ceci :<\/p>\n<pre class=\"code\"><code class=\"language-php\">&lt;?php\r\n$contenu = \"Lorem Elsass ipsum amet dui jetz gehts los leverwurscht non porta ac baeckeoffe ac bredele\";\r\n$text = wordwrap($contenu, 22, \"***\", true); \/\/ insertion de marqueurs ***\r\n\r\n$tcut = explode(\"***\", $text); \/\/ on cr\u00e9\u00e9 un tableau \u00e0 partir des marqueurs ***\r\n$part1 = $tcut[0]; \/\/ la partie \u00e0 mettre en exergue\r\n$part2 = '';\r\nfor($i=1; $i&lt;count($tcut); $i++) {\r\n\t$part2 .= $tcut[$i].' ';\r\n}\r\n$part2 = trim($part2); \/\/suppression du dernier espace dans la partie de texte restante\r\n\r\necho \"&lt;strong&gt;\".$part1.\"&lt;\/strong&gt; \".$part2;\r\n?&gt;<\/code><\/pre>\n<p>Donnera :<\/p>\n<blockquote><p><strong>Lorem Elsass ipsum<\/strong> amet dui jetz gehts los leverwurscht non porta ac baeckeoffe ac bredele<\/p><\/blockquote>\n<p>Voil\u00e0, encore une petite id\u00e9e pens\u00e9e \u00e0 pas d&rsquo;heure et apr\u00e8s une journ\u00e9e compl\u00e8te de boulot.<\/p>\n<p>J&rsquo;esp\u00e8re que ces astuces vous serviront \ud83d\ude09<br \/>\nSi vous avez d&rsquo;autres techniques je suis preneur, c&rsquo;est du fait maison quand j&rsquo;avais la t\u00eate dans le guidon, donc peut-\u00eatre qu&rsquo;il y a beaucoup plus simple ^^<\/p>\n<p>Merci pour votre lecture.<\/p>\n<p><em>PS : si jamais vous croisez des incoh\u00e9rences n&rsquo;h\u00e9sitez pas \u00e0 me le signaler<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ces derniers temps il m&rsquo;arrive souvent d&rsquo;avoir besoin de travailler des cha\u00eenes de caract\u00e8res pour des mises en pages pr\u00e9cises, pour ne pas dire complexes. Lors d&rsquo;un projet j&rsquo;ai eu \u00e0 faire ressortir le d\u00e9but d&rsquo;un extrait de page que je devais ins\u00e9rer dans un bloc, tout en conservant une deuxi\u00e8me partie de cet extrait [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1213,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[9],"tags":[341,342,233,340,339],"coauthors":[597],"class_list":["post-1197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriels","tag-chaine","tag-fonction","tag-php","tag-phrase","tag-tetiere"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=1197"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1197\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/1213"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=1197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=1197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=1197"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=1197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}