web-dev-qa-db-ja.com

<span>タグ内の</h3> <p>の後の最初の文字を囲む

これはthe_excerpt()からの出力でこれを行うことについて私が以前に尋ねた質問からの続きです。

私がやろうとしているのは、the_content()から次のような出力を取得して、現在のように次のような出力を取得することです。

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

そしてそれに次のことをさせてください:

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

私は以下のようにしてthe_excerpt()からの出力でこれを成功させました:

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

それは完全に動作するので、私はこのコード行を借りてそれを次のように修正しました。

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

このフィルタを実行すると、次のような出力が得られます。

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

しかし、私が'<span class="dropcap">\1</span>'を静的な文字または '@'のような文字列に変更すれば、うまくいきます。

置換文字列を何に変更する必要がありますか?それがthe_excerpt()の場合にはうまくいくがthe_content()の場合にはうまくいかないことが私には奇妙に思える。

1
Cedon

主な問題は、 positive lookbehind がありますが、capture groupがないため、\1または$1は使用できない変数です。

regex を修正して、キャプチャグループを提供します:'/(?<=\<\/h3\>\n<p>)(.)/'その後、$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

これがCSSによるスタイル設定のためのものである場合は、正規表現を使用する必要はありません。 h3 + p:first-letterを使うと、<p>の後に<h3>の最初の文字をスタイルすることができるはずです。

1
Florian