[PHP] éviter les mots orphelins dans un texte

Fermé
geemeetheway Messages postés 2 Date d'inscription mercredi 25 mars 2009 Statut Membre Dernière intervention 25 mars 2009 - 25 mars 2009 à 16:31
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 - 25 mars 2009 à 18:58
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 lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 335
25 mars 2009 à 17:01
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 mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
25 mars 2009 à 18:46
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 mercredi 25 mars 2009 Statut Membre Dernière intervention 25 mars 2009
25 mars 2009 à 18:54
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 mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922 > geemeetheway Messages postés 2 Date d'inscription mercredi 25 mars 2009 Statut Membre Dernière intervention 25 mars 2009
25 mars 2009 à 18:54
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 mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 922
25 mars 2009 à 18:58
preg_match_all ( '\<p\>(.+)\<\/p\>', $TheParagraph, $paragraphs);

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