0

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]); 
4

1 に答える 1

0

http://php.net/manual/de/function.preg-replace-callback.phpを試してください。

一致するたびに呼び出されるカスタム関数を作成できます。この関数では、a)CPを置き換えず、b)$ 1を入れず、ucfirstにすることを決定できます。

これがお役に立てば幸いです。

于 2012-02-20T17:10:04.747 に答える