Я пытаюсь преобразовать некоторые заголовки на моих 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>
и которые пишутся с большой буквы. Достаточно просто, вот сложный бит.
Во-первых, мне нужно сделать одно исключение. <p><strong>CP</strong></p>
не должно быть преобразовано в <h2>
. Я попытался добавить ?!(CP)
сразу после <p><strong>
, но это не работает.
Во-вторых, мне нужно, чтобы первая буква была заглавной. Когда я использую «ucfirst» с «strtolower» в preg_replace (например: ucfirst(strtolower(preg_replace($pattern, $replacement, $test)));
), он переводит все символы в строке в нижний регистр, и ucfirst не работает, так как он обнаруживает «<» как первый символ. </p>
Любые намеки или я даже иду в правильном направлении?
EDIT
Спасибо за помощь, определенно было лучше использовать 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]);