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()
.
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 );
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>
.