[RESOLU] Comment conserver le texte avec 'preg_replace' ?

Petit nouveau ! | 8 Messages

03 mai 2019, 19:41

Bonjour,

Comment conserver le texte avec 'preg_replace' ?

Dans la pratique...
$texte = <<<EOT
##### Section 1 : Section 1

###### Article 1

Bla

Bla

Bla

##### Section 2 : Section 2

###### Article 2

Bla

Bla

Bla

EOT;

$texte = '<p>'.preg_replace('/[\r\n]+/', '</p><p>', $texte).'</p>';

$texte = preg_replace('/<p>(\s*)(.*?)(\s*)<\/p>/m', '<p>$2</p>', $texte);

$texte = preg_replace('/<p.*?>#{1,}(\s)(Section)(.*?)<\/p>', '<div class="section">$2$3</div>', $texte);

echo $texte;
Or, mes deux sections reformatées s'affichent, *puis* les paragraphes. Or, je veux 'Section 1-> Article 1 (quand j'aurai trouvé la solution) -> Paragraphe', puis ' Section 2-> Article 2 -> Paragraphe,

J'ai essayé avec le quantificateur global 'g', qui ne plait pas à Php. 'm' ne change rien. J'ai essayé aussi avec 'preg_replace_callback", sans résultat.

(La solution ne passe pas par Markdown.)

Le nombre de croisillons ('#') peut être variable, empêchant le recours à 'str_replace'.

Merci pour votre aide.

Térébenthine

Eléphant du PHP | 63 Messages

04 mai 2019, 00:43

Hello. Il serait peut-être bon d'expliquer les règles pour aider à mieux visualiser le besoin, sinon on peut fusionner la logique des 3 preg_replace() en une fonction preg_replace_callback()
 
$texte = preg_replace_callback(
  '/^\s*(?:#+\s*((Section|Article).*?)|(.+?))?\s*\R/m', // ^\s* et \s*\R pour émuler trim()
  function($match) {
    if( !empty($match[2]) && $match[2] == 'Section' ) return "<div class=\"section\">{$match[1]}</div>"; // section
    if( !empty($match[2]) && $match[2] == 'Article' ) return "<div class=\"article\">{$match[1]}</div>"; // article
    if( !empty($match[3]) ) return "<p>{$match[3]}</p>"; // paragraphe
    return ""; // vide pour détruire les lignes vides
  },
  $texte
);

echo htmlspecialchars($texte), '<hr>', $texte;

Petit nouveau ! | 8 Messages

07 mai 2019, 14:12

@tesmet Je te remercie, trop tardivement, pour ton aide. :)