web-dev-qa-db-fra.com

Insérer le premier caractère après </ h3> <p> dans une balise <span>

C’est la suite d’une question que j’avais posée plus tôt à propos de cette opération avec la sortie de the_excerpt().

Ce que j'essaie de faire est de prendre la sortie suivante de the_content() pour prendre la sortie suivante telle qu'elle est actuellement:

<h3>Heading</h3>
<p>Paragraph</p>

Et le faire faire ce qui suit:

<h3>Heading</h3>
<p><span class="dropcap">P</span>aragraph</p>

J'ai réussi à le faire avec la sortie de the_excerpt() en utilisant les éléments suivants:

$the_excerpt = preg_replace('/^(.)/', '<span class="dropcap">\1</span>', $the_excerpt);

Cela fonctionne parfaitement alors j'ai emprunté cette ligne de code et l'ai modifiée pour:

$the_content = preg_replace( 
      '/(?<=\<\/h3\>\n<p>)./',
      '<span class="dropcap">\1</span>',
      $the_content
 );

Lorsque ce filtre est exécuté, le résultat est le suivant:

<h3>Heading</h3>
<p><span class="dropcap"></span>aragraph</p>

Mais si je change le '<span class="dropcap">\1</span>' en un caractère statique ou une chaîne comme "@", alors cela fonctionnera.

De quoi ai-je besoin pour changer la chaîne de remplacement? Cela me semble bizarre que cela fonctionne dans le cas de the_excerpt() mais pas pour the_content().

1
Cedon

Le problème majeur est simplement que vous avez un positive lookbehind mais pas capture group, donc \1 ou $1 n'est pas une variable utilisable.

Corrigez votre regex pour fournir le groupe de capture: '/(?<=\<\/h3\>\n<p>)(.)/' puis appelez $1.

ob_start();?>
    <h3>Heading</h3>
    <p>Paragraph</p>
    <p>Paragraph2</p>
<?php

$search = ob_get_clean();    

$result = preg_replace( 
        '/(?<=\<\/h3\>\n<p>)(.)/', 
        '<span class="dropcap">$1</span>', $search );
3
jgraup

S'il s'agit d'un style avec CSS, vous n'avez pas besoin d'utiliser une expression régulière. Avec h3 + p:first-letter, vous devriez pouvoir styler la première lettre d'un <p> après un <h3>.

2
Florian