[PHP] éviter les mots orphelins dans un texte

geemeetheway Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
Dalida Messages postés 6728 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai déjà une fonction bien pratique qui remplace l'espace entre les deux derniers mots d'un paragraphe par "& n b s p ;" afin d'éviter d'avoir un mot orphelin sur une seule ligne. Ce n'est jamais beau un mot orphelin!

voici le code :
	function anti_orphelins($TheParagraph) 
	{
		if (substr_count($TheParagraph," ") > 1) {
		$lastspace = strrpos($TheParagraph," ");
		$TheParagraph = substr_replace($TheParagraph," ",$lastspace,1);
		}
		return $TheParagraph;
	} 


Mon problème aujourd'hui est le suivant, j'ai de gros bloc de textes dans une base de données qui contiennent plusieurs paragraphes par enregistrement. Quand je le passe dans cette fonction, il ne traite que le dernier paragraphe. C'est logique de la façon dont elle est écrite.

Comment puis-je modifier ma fonction afin de pouvoir changer l'espace entre les deux derniers mots de chaque paragraphe dans un bloc de texte?

Merci
GeemeeTheway
A voir également:

3 réponses

gryzzly Messages postés 4608 Date d'inscription   Statut Contributeur Dernière intervention   1 335
 
Puisque tu parles de paragraphes, je suppose que tu respectes la nomenclature html et utilises les balises <p></p> ?
Dans ce cas, pourquoi ne pas parser ton code, récupérer les chaines comprises entre <p></p>, qui deviennent alors $TheParagraph, et pour chacun des paragraphes, tu exécute ta fonction anti orphelin.

https://www.google.fr/search?q=php+text+between+string&gws_rd=ssl
0
Dalida Messages postés 6728 Date d'inscription   Statut Contributeur Dernière intervention   922
 
salut,

il faut d'abord découper les paragraphes, les mettre dans un tableau et boucler pour appliquer ton nettoyage, en partant du principe que le retour chariot est codé avec la valeur du serveur :
<?php
	function anti_orphelins($TheParagraph) 
	{
		$paragraphs = explode(PHP_EOL, $TheParagraph);
		foreach($paragraphs as $key => $p)
			if(substr_count($p," ") > 1) {
				$lastspace = strrpos($p," ");
				$paragraphs[$key] = substr_replace($p,"&nbsp;",$lastspace,1);
			}
		return implode(PHP_EOL, $paragraphs);
	} 
?>

si les balises <p> sont enregistrés dans la base, tu peux découper avec une expression régulière.
0
geemeetheway Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Intéressant Dalida comme solution mais les paragraphes sont déjà encapsulés avec le tag < p >.
0
Dalida Messages postés 6728 Date d'inscription   Statut Contributeur Dernière intervention   922 > geemeetheway Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
si les balises <p> sont enregistrés dans la base, tu peux découper avec une expression régulière.
0
Dalida Messages postés 6728 Date d'inscription   Statut Contributeur Dernière intervention   922
 
preg_match_all ( '\<p\>(.+)\<\/p\>', $TheParagraph, $paragraphs);

je suis pas sûr de l'échappement sur < et >.
0