[PHP] éviter les mots orphelins dans un texte

geemeetheway Messages postés 2 Statut Membre -  
Dalida Messages postés 7114 Statut Contributeur -
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 5220 Statut Contributeur 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 7114 Statut Contributeur 923
 
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 Statut Membre
 
Intéressant Dalida comme solution mais les paragraphes sont déjà encapsulés avec le tag < p >.
0
Dalida Messages postés 7114 Statut Contributeur 923 > geemeetheway Messages postés 2 Statut Membre
 
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 7114 Statut Contributeur 923
 
preg_match_all ( '\<p\>(.+)\<\/p\>', $TheParagraph, $paragraphs);

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