HTMLページの一部のタイトルをに変換しようとしています<h2>
。パターンはシンプルです。
<?php
$test = "<p><strong>THIS IS A TEST</strong></p><div>And this is Random STUFF</div><p><strong>CP</strong></p>";
$pattern = "/<p><strong>([A-Z ]*?)<\/strong><\/p>/";
$replacement = "<h2>$1</h2>";
$test = preg_replace($pattern, $replacement, $test);
?>
基本的に、その間<p><strong></strong></p>
にあるものはすべて大文字で取得します。簡単なので、ここに複雑な部分があります。
まず、1つの例外を作成する必要があります。<p><strong>CP</strong></p>
に変換しないでください<h2>
。?!(CP)
直後に追加してみました<p><strong>
が、うまくいきません。
次に、最初の文字を大文字にする必要があります。preg_replace(例:)で「strtolower」とともに「ucfirst」を使用するとucfirst(strtolower(preg_replace($pattern, $replacement, $test)));
、文字列内のすべての文字が小文字になり、「<」が最初の文字であることが検出されるため、ucfirstは機能しません。
ヒントはありますか、それとも私は正しい方向に進んでいますか?
編集
助けてくれてありがとう、使った方が間違いなく良かったpreg_replace_callback
です。すべてのタイトルが3文字を超えていることがわかったので、リミッターを追加しました。特殊文字も追加されました。これが私の最終的なコードです:
$pattern = "/<p><strong>([A-ZÀ-ÿ0-9 ']{3,}?)<\/strong><\/p>/";
$replacement = "<h2>$1</h2>";
$test[$i] = preg_replace_callback($pattern, create_function('$matches', 'return "<h2>".ucfirst(mb_strtolower($matches[1]))."</h2>";'), $test[$i]);